2011-04-09 24 views
5

Yerleşik JAR dosyasında bulunan bir kaynağı yüklemeye çalışıyorum. Proje aslında aşağıdaki yapıya sahip bir EAR dosyasını kullanarak JBoss dağıtıldığında: main.java itibarenYerleşik JAR dosyasından kaynak yükleme

deploy.ear 
| 
|-> project.sar 
    | 
    |-> sub_project.jar 
    | | 
    | |-> settings.xml 
    | 
    |-> com/path/project/ 
     | 
     |-> main.class 

Ben InputStreamsettings.xml için almak istiyorum. Bunu yapmanın doğru yolu nedir?

Benim şimdiki anlayış Aşağıdaki kod çalışması gerekir, ancak null dönen olduğunu: Bazı deneme yanılma sonra

this.getClass().getResourceAsStream("settings.xml"); 

Güncelleme

, aşağıdaki ifadeler çalışır:

getClass().getResourceAsStream("/settings.xml"); 
getClass().getResourceAsStream("/sub_project.jar/settings.xml"); 
getClass().getClassLoader().getResourceAsStream("/settings.xml"); 
getClass().getClassLoader().getResourceAsStream("settings.xml"); 
getClass().getClassLoader().getResourceAsStream("sub_project.jar/settings.xml"); 
getClass().getClassLoader().getResourceAsStream("/sub_project.jar/settings.xml"); 
+0

java sınıf yükleyici kullanarak söz konusu kaynağın alabilirsiniz kendi ClassLoader gelen,

Ancak o zaman iç kavanozu yüklemek için iş. Bir kavanoz çözümü bu problemi çözüyor, bkz. Eran'ın cevabı. – MeBigFatGuy

+1

/sub_project.jar/settings.xml dosyasının standart bir işaret olduğundan emin değilsiniz. JBoss uzantısı olabilir. –

+0

"/settings.xml" çalışırken "settings.xml" nin neden başarısız olduğunu şaşırdım, ancak sonra şu belgeleri okudum: * Kaynak adı "/" ile başlıyorsa, değişmez; aksi halde, paket adı, "." dönüştürüldükten sonra kaynak adına eklenir. "/".* Class.class bunu yapar, ancak ClassLoader.class yapmaz. Bugün yeni bir şey öğrendim ... –

cevap

2

Bu iyi bir kaynak olabilir: http://one-jar.sourceforge.net/version-0.95/

Ana fikir, iç JAR'ın dış JAR'ı otomatik olarak yükleyen ClassLoader tarafından yüklenmemesidir, bunu elle yapmanız gerekir, örn. Bir StreamClassLoader kullanarak böylece kurulum olmaz, gömülü kavanoz gelen kaynak yüklenen edemez getResourceAsStream(...)

+0

One-Jar'ı kullanmayı mı düşünüyorsunuz, yoksa iç kavanoz içeriğine nasıl erişeceğinize dair bir referans için mi kullanıyorsunuz? – cmcginty

+0

Birincisi JAR değil, EAR; Bu, standart olandan daha karmaşık bir sınıf yüküne sahip olduğu anlamına gelir. EAR sınıf yükleyicileri, META-INF içeriğine dayalı olarak iç içe geçmiş JAR'lardan ve WARS'lerden yükleme kaynaklarını ele alır. –

+2

@ Vladimir: asıl soru bunu belirtmedi. OP, orijinal soruda çok önemli ayrıntılar bıraktı. Detay için soru altındaki 'düzenlenmiş [zaman]' bağlantısını tıklayın. – BalusC

İlgili konular