2009-11-10 13 views
15

Bu uygulama için bir uygulama ve yapılandırma dosyaları içeren bir JAR dosyasına sahibim. Uygulama, sınıflandırma dosyasından (ClassLoader.getResource() kullanarak) yapılandırma dosyalarını yükler ve bağımlılıklarını JAR dosyasına yapılan yapılandırma dosyalarını kullanarak tamamen memnun eder.Çalışmakta olan bir kavanozdaki bir dosyayı geçersiz kılmak için sınıfyolunu kullanabilir miyim?

Bazen, uygulamanın biraz farklı bir yapılandırma ile çalıştırılmasını istiyorum (özellikle farklı bir veritabanına işaret etmek için JDBC URL'sini geçersiz kılmak istiyorum), bu yüzden yeni bir yapılandırma dosyası oluşturuyorum, onu doğru dizin yapısında saklayın (hangi bir dizin bir sınıf yolu girişinin /config) anlamına gelir ve böyle bir şey yapmak istiyorum:

java -cp new-config:. -jar application.jar 

Ama sınıf yolu uygulama kavanoz içeriğini önce new-config yol girişini olması alınamıyor. JAR'ın içeriğinin her zaman sınıf yolundaki ilk şey olduğu kodlanmış mı?

+0

sen application.jar ilgili bir yol içinde kendi kavanoz dosyasında, de kavanoz dışında yapılandırma koyarak denediniz Dosya (../conf/config.jar)? Bunu yaparsanız, uygulama bildiriminde bu yapılandırma kavanozuna işaret eden sınıf yolunu ayarlayabilir ve config.jar değiştirerek yeni yapılandırmayı ayarlayabilirsiniz. Keşke cevabımı onaylamak için bir demo yapmak için daha fazla zamanım olsaydı, ama yapamam ... bu yüzden onu bir yorum olarak yazdım – JuanZe

+0

Yani, JAR'ın içinde mi demek istiyorsun? – Guss

+0

Evet, uygulama ile aynı kavanoza yerleştirmek yerine, ikinci bir kavanoz içinde yapılandırmayı koyuyorum ... – JuanZe

cevap

20

Neden sadece -jar belirtmeden uygulanmasını talep ve bunun yerine açıkça uygulama ana sınıf isim? Bu, hem new-config'ınızı hem de application.jar'inizi, gereken sıraya göre belirlemenize olanak tanır:

, ör. Ben ana sınıfın adı kavanoz içindeki MANIFEST.MF dosyasında bulunabilir inanıyoruz

java -cp new-config:application.jar Application.Main.Class 

.... ("Yeni-config" varsayarak geçersiz kılınan özellikleri dosya içeren bir dizindir)

+2

Asıl sorun, aslında -cp argümanını kullanmama, fakat manifest dosyasında sınıf yolunu belirtmem, çünkü uygulama diğer birçok harici JAR'a ihtiyaç duyuyor. Ama bahse girerim, manifaturayı manifestten çıkartan ve otomatik olarak ilgili bir komut satırı oluşturan bir komut dosyası yazabilirim, bu muhtemelen kullanacağım cevaptır. – Guss

1

Sadece CLASSPATH kullanılarak mümkün olmayabilir. Kaynağı bulmak için ClassLoader.getResource() numaralı aramayı kullanmanın bir yolu vardır. Bunu yapıyorsa, CLASSPATH'ı atlıyor.

3

-jar seçeneğiyle belirtilen JAR arşivi, diğer tüm değerleri geçersiz kılar.

Genel olarak bir dış yapılandırma dosyasıyla yapmanız veya kendi çözümünüzü ClassLoader.getResource() ile yapmanız gerekir.

Biz bu çözmek için özel bir çözüm kullanmak - böylece gibi iç özelliklerini yüklemek:

final Properties p = new Properties(); 
p.load(DefaultConfiguration.class.getResourceAsStream("config.properties")); 

Sonra aynı şekilde dış dosyası yüklemek ve dış olanlarla iç değerlerin üzerine yazılır.

sınıf yükleme işleri nasıl gördüğünü ilgili bilgi için

:

http://java.sun.com/javase/6/docs/technotes/tools/findingclasses.html

+0

Bu gerçekten sorun. Anladığım kadarıyla, uygulamanın farklı bir şekilde başlatılması dışında - alasdairg tarafından önerildiği gibi, ya da bazı özel yükleme kodları yazmanın bir yolu yoktur. Teşekkürler. – Guss

13

Eğer uygulamayı başlatmak için -jar seçeneğini kullandığınızda:

... JAR dosyası tüm kullanıcı sınıfları kaynağıdır ve diğer kullanıcı sınıfı yol ayarları dikkate alınmaz.

here tarif edildiği gibi. Bir geçici çözüm, ek yolu içerecek şekilde (here açıklanan) jar dosyasının manifestindeki sınıf yolunu belirtmek olacaktır.Ancak, yalnızca yapılandırmayı değiştirmekle ilgili konuşuyor olmanız nedeniyle, sınıf yoluna bağlı olmayan farklı bir yaklaşım almak isteyebilirsiniz. Örneğin, uygulamalarımı veritabanları, vb. Konumlarını belirlemek için özellik dosyalarını kullanarak ilkbaharda yapılandırarak yapıyorum. İlkbahar yapılandırmam test, QA ve canlı ortamlar arasında tutarlı olsa da, uygulamayı başlatırken bir komut satırı bağımsız değişkeni olarak farklı bir özellik dosyası geçiriyorum. .

Bahar Yapılandırma Parçacığı

<bean id="MyDataSource" class="org.springframework.jdbc.datasource.SingleConnectionDataSource"> 
    <property name="url" value="jdbc:microsoft:sqlserver://${dbServer}:${dbPort};DatabaseName=${dbName}"/> 
    <property name="username" value="${dbUserName}"/> 
    <property name="password" value="${dbPassword}"/> 
    <property name="suppressClose" value="false"/> 
</bean> 

Mülkiyet Parçacığı

dbServer=MyServer 
dbPort=1433 
dbName=MyDb 
dbUserName=Me 
dbPassword=foobar 
+0

Yapılandırma dosyasını isteğe bağlı bir parametre olarak geçmek iyi bir fikir olsa da, uygulamam şu anda çok fazla parametre kabul ediyor ve bir tane daha eklemek kullanıcıları için sorun yaratacaktır. Cevabınız için teşekkürler. – Guss

+0

Uygulamanızı nasıl başlatıyorsunuz? Uygulamanın parametreleri Webstart, .bat veya .sh script, vb. Aracılığıyla başlatılarak kullanıcıya gizlendiğini düşünürdüm. – Adamski

+0

Hayır - kullanıcılar uygulamayı kendileri komut satırından başlatmak için gerekli parametrelerden geçiyor - tarihler , dosyalar işlenecek vb. – Guss

İlgili konular