Java/Gradle tashqi konfiguratsiya fayllarini o'qish

Mening loyiha tuzilmam quyidagicha ko'rinadi. Konfiguratsiya faylini manba sifatida qo'shishni istamayman, lekin uning o'rniga ishni bajarish vaqtida o'qib chiqing, shunda biz faqat parametrlarni qayta kompilyatsiya va tarqatmasdan o'zgartirishimiz mumkin. Mening muammom ikki narsadir

  1. Faylni o'qib chiqqach, turli usullar bilan ishlashga harakat qilyapman (quyidagi amaliyotni ko'rib chiqmoqchiman)
  2. Graderdan foydalanganda, faylni qanday yaratish va/yoki tarqatish kerakligini aytishim kerakmi? Bu muammoning bir qismi bo'lishi mumkin, deb o'ylayman.Teklifni tuzish yoki Eclipse-da disk raskadrovka qilishga urinishda konfiguratsiya fayli o'rnatilmaydi.

Mening loyiha tuzilmasi:

myproj\
        \src
            \main
                \config
                    \com\my_app1\
                                config.dev.properties
                                config.qa.properties
                \java
                    \com\myapp1\
                                \model\
                                \service\
                                \util\
                                    Config.java
            \test              

Config.java:

public Config(){
        try {
            String configPath = "/config.dev.properties"; //TODO: pass env in as parameter
            System.out.println(configPath);
            final File configFile = new File(configPath);
            FileInputStream input = new FileInputStream(configFile);

            Properties prop = new Properties()
            prop.load(input);
            String prop1 = prop.getProperty("PROP1");
            System.out.println(prop1);
        } catch (IOException ex) {
            ex.printStackTrace();
        } 
    }   
9
Haqiqiy build.gradle-ni baham ko'rasizmi?
qo'shib qo'ydi muallif ToYonos, manba
Ilovani qanday va qaerda tarqatishni bilmayman, lekin uni ishlatishingiz mumkin: github. MAQOMOTI/stevesaliman/gradle-properties-plugin ? Ikkinchidan, boshqa konfiguratsiyaning yo'llarini o'z ichiga oladigan faylga bitta statik yo'l bo'lishi kerak.
qo'shib qo'ydi muallif Michał Piątkowski, manba
Ilovani qanday va qaerda tarqatishni bilmayman, lekin uni ishlatishingiz mumkin: github. MAQOMOTI/stevesaliman/gradle-properties-plugin ? Ikkinchidan, boshqa konfiguratsiyaning yo'llarini o'z ichiga oladigan faylga bitta statik yo'l bo'lishi kerak.
qo'shib qo'ydi muallif Michał Piątkowski, manba

6 javoblar

Ans 1.

Faylni o'qib chiqqach, men turli usullar bilan ishlashni xohlamayman   (pastda joriy amaliyotni ko'rib chiqayapman)

Siz tasvirlagan konfiguratsiya faylingizning joylashuvi bilan,

O'zgartirish

String configPath = "/config.dev.properties";

uchun

String configPath = "src \ main \ config \ com \ my_app1 \ config.dev.properties";

Biroq birinchi navbatda ikkinchi javobni o'qing.

Ans 2:

When using gradle, do i needuchun tell it how uchun build/or deploy the file and where? I think that may be part of the problem..that the config file is not getting deployed when doing a gradle build or trying uchun debug in Eclipse.

Ikkita variantingiz bor:

  1. Rename your config direcuchunry uchun resources. Gradle auuchunmatically builds the resources under "src/main/resources" direcuchunry.
  2. Let Gradle know the additional direcuchunry uchun be considered as resources.

    sourceSets {
        main {
            resources {
                srcDirs = ["src\main\config\com\my_app1"]
                includes = ["**/*.properties"]
            }
        }
     }
    
4
qo'shib qo'ydi
@VHS - Sizning javobingiz men istagan narsaga eng yaqin, xususan, An 2.2. Ha, nayza, uni tashqi tomondan istayman. Shunday qilib, siz aytib o'tganidek, build.gradle-da kiritilgan yozuvni aniqladim va hozirda bir graderni yaratishda,/my_app1/build/resources/main papkasini yaratganligini ko'raman. Biroq, yuqoridagi kod bilan hali ham buni o'qiy olmadim. xato: "java.io.FileNotFoundException: \ config.dev.properties (Tizim ko'rsatilgan yo'lni topa olmaydi)"
qo'shib qo'ydi muallif mike01010, manba
@VHS thanks, xuddi jar yoqasiga konfiguratsiya qilish kabi ko'rinadi. biz uchun bir variant emas. Ish vaqti davomida konfiguratsiya qiymatlarini o'zgartirishni xohlaymiz. buni amalga oshirishning eng yaxshi yo'lini aniqlashga urinib ko'radi
qo'shib qo'ydi muallif mike01010, manba
@VHS menga qanday qilib buni qilishni ko'rsatib berishi mumkin. Aslida konfiguratsiya papkasini "resurslar" ga va ClassLoader.class.getResourceAsStream-dan foydalanib, nomini o'zgartirishga harakat qildim. Bundan tashqari, ushbu usul bizni konfiguratsiya yozuvlarini qayta tiklash va qayta joylashtirish kerak bo'lmasdan o'zgartirishi mumkinmi?
qo'shib qo'ydi muallif mike01010, manba
@VHS, bu ishlaydi, lekin kodning tarqatilishi mumkin emas, deb o'ylamayman, chunki tarqatilgan paytda "build" papkasi bo'lmaydi. Agar nisbiy yo`l tutish vaqtida va tutilish vaqtida disk raskadrovka uchun ham ishlasa yaxshi bo'lardi
qo'shib qo'ydi muallif mike01010, manba
@VHS, men buni tuzganimdan keyin uni tuzatish orqali diskvalifikatsiya qilaman. Eclipse manba fayllari ma'lum bir loyiha uchun qaerda ekanligini bilishim kerakmi?
qo'shib qo'ydi muallif mike01010, manba
O'ylaymanki, afishada fayl kavanoz ichiga joylashtirilmasligini xohlamaydi va uni yana ochish va qayta zipping qilmasdan tweaked bo'lishi mumkin bo'lgan katalogda bo'lishini istaydi.
qo'shib qo'ydi muallif lance-java, manba
Agar u O'Zga kerak bo'lgan narsalarni tasdiqlasa, men javobimni o'zgartiraman.
qo'shib qo'ydi muallif VHS, manba
@ mike01010, agar siz Eclipse orqali disk raskadrovka qilsangiz, tegishli yo'llar loyiha papkasiga mos keladi - src papkasiga ega papka. Shuning uchun build papkasi src bilan bir xil darajada bo'lsa, build/resources/main/config.dev.properties dan foydalanishingiz mumkin.
qo'shib qo'ydi muallif VHS, manba
@ mike01010, men tashvishingizni tushunaman. Shuning uchun odamlar o'zlarining nisbiy yo'lidan emas, balki sinf yo'lidan fayllarni o'qishlarini tavsiya qilishadi. Resurs fayli klaspathda bo'lsa, ishlash muddati ushlab qolish yoki tashqarida bo'lishidan qat'i nazar, har qanday yo'lni ko'rsatishga hojat yo'q.
qo'shib qo'ydi muallif VHS, manba
bu yordamiga qarang.
qo'shib qo'ydi muallif VHS, manba

Faylni o'qish faqat harakat qilyapman, biroq turli usullar bilan ishlamayapman (pastda ko'rib turgan amaldagi dasturga qarang)

Siz bu bayonotni aniqlashtirishingiz kerak. Mavjud fayllardan xususiyatlarni yuklashga harakat qilyapsizmi? Properties obyektini yuklagan kod to'g'ri bo'lgani uchun. Ehtimol, xato fayl yo'lida.

Yaxshiyamki, men nima qilmoqchisiz, deb o'ylayman. Savolingizni aniqlab olishingiz kerak. Ilovangiz quyida keltirilgan misolga o'xshab olib boriladigan jarga egami? Xotining tashqarisidagi tashqi faylni yuklashga harakat qilyapsizmi (Bu holda grader sizga yordam bera olmaydi)?

Agar siz bunday dasturni oddiy dastur sifatida yaratadigan bo'lsangiz

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

public class Main {
    public static void main(String[]args) {
        File configFile = new File("test.properties");
        System.out.println("Reading config from = " + configFile.getAbsolutePath());

        FileInputStream fis = null;
        Properties properties = new Properties();

        try {
            fis = new FileInputStream(configFile);
            properties.load(fis);
        } catch (IOException e) {
            e.printStackTrace();
            return;
        } finally {
            if(fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {}
            }
        }

        System.out.println("user = " + properties.getProperty("user"));
    }
}

Dasturxonni ishlatganda, dastur ilovalar ish katalogida joylashgan test.properties deb nomlangan fayldan xususiyatlarni yuklashga harakat qiladi.

Shunday qilib, agar shunday bo'lsa, test.properties bo'lsa

user=Flood2d

Chiqish bo'ladi

Reading config from = C:\test.properties
user = Flood2d

Buning sababi, jar fayl va test.properties fayli C: \ ichida joylashganligi va men uni o'sha yerdan boshqaraman.

Ba'zi java ilovalari MacOS-da Windows yoki /Library/Application da % appdata% kabi joylardan konfiguratsiya yuklaydi. Ushbu echim, ilovaning o'zgarishi mumkin bo'lgan konfiguratsiyaga ega bo'lganida qo'llaniladi (dasturni qo'lda tahrirlash yoki dasturning o'zi tomonidan o'zgartirilishi mumkin), shuning uchun dasturni yangi configs bilan qayta kompilyatsiya qilishning hojati yo'q.

Agar biron narsani noto'g'ri tushungan bo'lsam, menga xabar bering, shuning uchun biz nimani so'rashga harakat qilyapmiz.

4
qo'shib qo'ydi
kodni bitdan tozalashga imkon beruvchi resurslar bilan ishlashga harakat qiling
qo'shib qo'ydi muallif rajadilipkolli, manba
Taklifingiz uchun tashakkur. Men nihoyat foydalanishga qaror qildim, chunki bu savolga o'xshash kod.
qo'shib qo'ydi muallif Flood2d, manba

Faylni o'qish faqat harakat qilyapman, biroq turli usullar bilan ishlamayapman (pastda ko'rib turgan amaldagi dasturga qarang)

Siz bu bayonotni aniqlashtirishingiz kerak. Mavjud fayllardan xususiyatlarni yuklashga harakat qilyapsizmi? Properties obyektini yuklagan kod to'g'ri bo'lgani uchun. Ehtimol, xato fayl yo'lida.

Yaxshiyamki, men nima qilmoqchisiz, deb o'ylayman. Savolingizni aniqlab olishingiz kerak. Ilovangiz quyida keltirilgan misolga o'xshab olib boriladigan jarga egami? Xotining tashqarisidagi tashqi faylni yuklashga harakat qilyapsizmi (Bu holda grader sizga yordam bera olmaydi)?

Agar siz bunday dasturni oddiy dastur sifatida yaratadigan bo'lsangiz

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

public class Main {
    public static void main(String[]args) {
        File configFile = new File("test.properties");
        System.out.println("Reading config from = " + configFile.getAbsolutePath());

        FileInputStream fis = null;
        Properties properties = new Properties();

        try {
            fis = new FileInputStream(configFile);
            properties.load(fis);
        } catch (IOException e) {
            e.printStackTrace();
            return;
        } finally {
            if(fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {}
            }
        }

        System.out.println("user = " + properties.getProperty("user"));
    }
}

Dasturxonni ishlatganda, dastur ilovalar ish katalogida joylashgan test.properties deb nomlangan fayldan xususiyatlarni yuklashga harakat qiladi.

Shunday qilib, agar shunday bo'lsa, test.properties bo'lsa

user=Flood2d

Chiqish bo'ladi

Reading config from = C:\test.properties
user = Flood2d

Buning sababi, jar fayl va test.properties fayli C: \ ichida joylashganligi va men uni o'sha yerdan boshqaraman.

Ba'zi java ilovalari MacOS-da Windows yoki /Library/Application da % appdata% kabi joylardan konfiguratsiya yuklaydi. Ushbu echim, ilovaning o'zgarishi mumkin bo'lgan konfiguratsiyaga ega bo'lganida qo'llaniladi (dasturni qo'lda tahrirlash yoki dasturning o'zi tomonidan o'zgartirilishi mumkin), shuning uchun dasturni yangi configs bilan qayta kompilyatsiya qilishning hojati yo'q.

Agar biron narsani noto'g'ri tushungan bo'lsam, menga xabar bering, shuning uchun biz nimani so'rashga harakat qilyapmiz.

4
qo'shib qo'ydi
kodni bitdan tozalashga imkon beruvchi resurslar bilan ishlashga harakat qiling
qo'shib qo'ydi muallif rajadilipkolli, manba
Taklifingiz uchun tashakkur. Men nihoyat foydalanishga qaror qildim, chunki bu savolga o'xshash kod.
qo'shib qo'ydi muallif Flood2d, manba

Sizning savolingiz biroz noaniq bo'lsa-da, konfiguratsiya fayllarini banklarning "tashqarisida" yashashi kerakligini his qilaman.

dastur plagini ga qarashingizni tavsiya qilaman. Bu sizning arizangizning zip formatini yaratadi va uni ishga tushirish uchun boshlang'ich skript yaratadi. Menimcha, sizga kerak bo'ladi:

  1. Config fayllari uchun qo'shimcha papka qo'shish uchun distZip vazifasini moslashtiring
  2. boshlang'ich ssenariyning sinfi yo'llariga qo'shimcha papka qo'shish uchun startScripts vazifasini moslashtiring
1
qo'shib qo'ydi

Tashqi (nostandart) faylni o'qib chiqishim uchun echim ilova ildizida konfiguratsiya papkasini yaratishdir.

myproj/
      /configs

Buning uchun konfiguratsiyalari "config/config.dev.properies" yordamida o'qishimga imkon berdi.

0
qo'shib qo'ydi

Men gradus bilan tanish emasman, shuning uchun men sizning savolingiz bo'yicha faqatgina ba'zi tavsiyalar bera olaman. 1. Sizning mulkingizning to'liq yo'lini FileInputStream parametri sifatida berishingiz mumkin, deb o'ylayman, keyin prop.load-dan foydalanib uni yuklang.

FileInputStream input = new FileInputStream("src/main/.../config.dev.properties");

Properties prop = new Properties()
prop.load(input);
// ....your code
0
qo'shib qo'ydi
Iltimos, kodni faqat javoblarni yozmang, buning o'rniga kodingiz nima va uni qanday qilib echish muammolarini tushuntiring.
qo'shib qo'ydi muallif LJᛃ, manba