Konuyu özetleyebilmek için aşağıdaki örnek proje yapılarını hazırladım.

config.xml

<root>
    <settings>
        <connStr>Db bağlantı bilgileri</connStr>
        <appName>Test Application</appName>
        <logging>true</logging>
        <appType>Web</appType>
    </settings>
</root>

FrAPP (Class library)

Package Name : com.test.frApp.utils

ReadConfig(String key)
{
    //Bu kod parçasında config.xml 
    //dosyasından değer okunuyor
}

JsfAPP (JSF Application)

Package Name : com.test.jsfApp

ReadConfig(String key)
{
    //Bu kod parçasında config.xml 
    //dosyasından değer okunuyor
}

DesktopAPP (Java Application)

Package Name : com.test.desktopApp

ReadValue(String key)
{
    //Bu kod parçasında FrApp 
    //içerisindeki ReadConfig metodu çağrılıyor
}

FrApp jar' ının içindeki metod config.xml dosyasından değer okumaktadır. JsfApp ve DesktopApp uygulamalarınan FrApp yi external jar olarak ekliyorum. Şu anki yapıya göre config dosyası c:\config.xml dizininde duruyor. FrApp içindeki ReadConfig metodundan JAXB ile c:\config.xml' in içinden değerleri okuyorum.

Gelelim amacıma, config.xml herhangi bir dizinin altına koymak istemiyorum. Hangi uygulamaya ait ise o projenin içindeki herhangi bir dizine(WEB-INF , META-INF yada projede herhangi bir yer) koymak istiyorum. Yani Path filan belirtmeden hangi uygulama çalışıyor ise FrApp içinde bu çalışan uygulamanın içindeki dizini dinamik olarak bulup config.xml dosyasını okumak istiyorum.

Yaptığım araştırmalarda aşağıdaki gibi kod parçaları buldum ama tam olarak amacıma ulaşamadım. çalışan jar'ın dizinini bulmaya yarıyor ama uygulamayı tomcat a deploy ettiğimde yine path sorunları yaşıyorum.

  String xmlPath =  new java.io.File("").getAbsolutePath() +"config.xml"

soruldu: 11 Tem '14, 02:32

M%C3%BCsl%C3%BCm%20%C3%96ZT%C3%9CRK's gravatar image

Müslüm ÖZTÜRK
10.6k103690
cevap kabul oranı: 28%

değiştirildi: 23 Tem '14, 01:51

En sonra yazdığınız satırda boş bir dosya oluşturuluyor, dosya default olarak uygulama dizininde oluşturulacaktır, bu şekilde getAbsoluePath ile uygulama klasörü konumu alınıyor. devamında aramak istediğniz dosyayı okuyordusunuz.. Ama yine de en mantıklı çözüm bence de classloader üzerinden gitmek..

(13 Tem '14, 14:39) dreampowder dreampowder's gravatar image

Şöyle denesek nasıl olur. Her aplikasyonda com.test.appConfig dizinin içerisinde config.xml dosyası olduğunu varsayarsak;

InputStream input1 = getClass().getResourceAsStream("/com/test/appConfig/config.xml");

veya

InputStream input2 = Thread.currentThread().getContextClassLoader().getResourceAsStream("/com/test/appConfig/config.xml");
permanent link

cevaplandı: 11 Tem '14, 03:28

SaRPaRDa's gravatar image

SaRPaRDa
5.0k213165
cevap kabul oranı: 27%

HSQL gibi küçük veritabanlarını kullanmayı düşünebilirsin.

(11 Tem '14, 06:55) SaRPaRDa SaRPaRDa's gravatar image

Herhangi bir ayar yada bağlantı bilgi olduğunda bu config dosyası üzerinden okuyacağım. Eğer HSQL de kullansam onun bağlantı bilgilerini yine bu config dosyasında saklayacağım ;).

Bu arada Thread.currentThread().getContextClassLoader() metodunu ClassLibrary içindeki main metoduna debug yaparak denedim çalışmıyor. Fakat JSF de ManagedBean üzerinden debug ile denediğimde çalıştı.

(11 Tem '14, 07:12) Müslüm ÖZTÜRK M%C3%BCsl%C3%BCm%20%C3%96ZT%C3%9CRK's gravatar image

HSQL'i programın ayarlarını tutmak için kullanacağından, veritabanının bağlantı adresi her daim aynı olacağından (localhost:xxxx) ve kullanıcıların bu veritabanından habersiz olacağından dolayı HSQL'in bilgilerini "çakılı" olarak kullanabilirsin. :)

(11 Tem '14, 07:33) SaRPaRDa SaRPaRDa's gravatar image

Her aplikasyonda com.test.appConfig dizinin içerisinde config.xml dosyası olduğu durumda xml dosyası jar içinde olmuş olacak. Eğer config.xml içinde değişiklik yapmak istersem jar içini açmak gerekecek bunu nasıl bir çözüm önerirsiniz

(11 Tem '14, 09:01) Müslüm ÖZTÜRK M%C3%BCsl%C3%BCm%20%C3%96ZT%C3%9CRK's gravatar image

Öncelikle, böyle olmasını sen istemişsin! :) Bkz: "Gelelim amacıma, config.xml......"

Aylardan Ramazan ve Saat 16.20 olduğundan dolayı, sakıncası yoksa ben bu soruya linkle cevap vermek istiyorum.

http://www.drdobbs.com/jvm/solving-the-configuration-problem-for-ja/232601218

http://commons.apache.org/proper/commons-configuration/

(11 Tem '14, 09:34) SaRPaRDa SaRPaRDa's gravatar image

Doğru kendimle çelişmişim :), Daha sonradan aklıma geldi jar' ın içinde kaldığı o yüzden tutarsız oldu sorular. Bendeki de ramazanın etkisi olsa gerek. Paylaştığın linkleri inceleyeceğim. Çözüm sunmanın sakıncası olmaz linkle yada linklisiz ;). Hayırlı iftarlar.

(11 Tem '14, 12:15) Müslüm ÖZTÜRK M%C3%BCsl%C3%BCm%20%C3%96ZT%C3%9CRK's gravatar image
6 yorumdan 5 tanesi gösteriliyor hepsini göster

Config dosyasini classpath icinde kullanildigi sinif ile ayni pakete koyarak, asagidaki sekilde okuyabilirsiniz:

public static void main(final String[] args) throws Exception {

       final InputStream in = new Main().getClass().getResourceAsStream("test.xml");
       final BufferedReader reader = new BufferedReader(new InputStreamReader(in));
       final StringBuilder out = new StringBuilder();
       String line;
       while ((line = reader.readLine()) != null) {
           out.append(line);
       }
       System.out.println(out.toString()); // Prints the string content read from input stream
       reader.close();

}

Dosya ve dizin yapisi:

com/pratikprogramci/Main.java
com/pratikprogramci/test.xml

permanent link

cevaplandı: 11 Tem '14, 05:04

%C3%B6zcanacar's gravatar image

özcanacar ♦♦
17.2k59183183
cevap kabul oranı: 52%

Özcan bey, Frapp içindeki readconfig metoduna class göndermeden bir çözüm yolu bulmaya çalışıyorum.

(11 Tem '14, 05:57) Müslüm ÖZTÜRK M%C3%BCsl%C3%BCm%20%C3%96ZT%C3%9CRK's gravatar image

Merhaba, jar içindeki herhangi bir dosya yolu nasıl gösterilir sorununu bende yaşamıştım daha önce, çözümümü http://kirazibrahim.blogspot.com.tr/2014/07/using-spring-framework-in-standalone.html blogumda yayınladım belki yardımcı olur sana.. Herhangi bir şekilde /com/... gibi şeyler kullanamazsın çünkü jar paketi içerisinde bu paketler o şekilde yer almayacaklardır. Bende applicationContext.xml dosyasının yolunu gösterememiştim main içerisinde çagırıldıgı yerde, applicationCOntext.xml dosyam resources paketi altında

public static void main(String[] args) throws Exception {

    ApplicationContext context = new ClassPathXmlApplicationContext(
            "/applicationContext.xml");

    BankaFatura bankaFatura = (BankaFatura) context.getBean("bankaFatura");
    bankaFatura.readMail();

}
permanent link

cevaplandı: 23 Tem '14, 02:01

cherry's gravatar image

cherry
101126
cevap kabul oranı: 20%

değiştirildi: 23 Tem '14, 02:14

Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×1,077
×33
×3
×2
×2

Soruldu: 11 Tem '14, 02:32

Görüntüleme: 1,038 kez

Son güncelleme: 23 Tem '14, 02:14

powered by BitNami OSQA