2010-04-14 12 views
9

Ho un file jar con risorse (principalmente configurazione per cache, registrazione, ecc.) Che desidero distribuire.Accesso alle risorse JAR

Sto avendo un problema con i relativi percorsi per quelle risorse, così ho fatto quello che ho trovato in un'altra domanda StackOverflow, che ha detto che questo era un modo valido:

ClassInTheSamePackageOfTheResource.class.getResourceAsStream('resource.xml'); 

Purtroppo questo fa non funziona.

Qualche idea? Grazie!

PS: Ovviamente non posso usare percorsi assoluti, e mi piacerebbe evitare variabili d'ambiente, se possibile

+0

Il file di risorse si trova nella stessa cartella del file di classe? È un'applicazione autonoma o in esecuzione su un server web? – kgiannakakis

+0

Si trova nella stessa cartella. È un jar pensato per essere incluso in un'applicazione web, sì (ma penso che dovrebbe essere irrilevante) –

+2

è pertinente le regole per la ricerca delle risorse associate a una data classe sono implementate dal loader della classe che definisce. Pertanto, il classloader dell'app della tua app web potrebbe comportarsi in modo leggermente diverso in base all'implementazione. Solo un pensiero. –

risposta

11

Assicurarsi che la cartella delle risorse sia elencata come cartella di origine nelle impostazioni del progetto. Inoltre, assicurati che la cartella delle risorse sia impostata per l'esportazione quando costruisci il tuo jar.

È possibile aggiungere un'estensione .zip al file jar, quindi aprirlo per assicurarsi che le risorse siano incluse e nella posizione prevista.

Io uso sempre percorsi assoluti come questo:

InputStream input = this.getClass().getResourceAsStream("/image.gif"); 

Quando si utilizza i percorsi assoluti, "/" è la cartella principale nel file jar, non la cartella principale della macchina host.

+4

+1 per il nota su/essendo la cartella radice del jar. – Powerlord

+0

Infatti, ho usato il metodo del percorso assoluto (jar) che hai descritto e ha funzionato! Non so perché non ha fatto il trucco con quello relativo ... ma abbastanza buono è abbastanza buono –

1

devo sempre di decifrare attraverso getResourceAsStream per fare questo lavoro. Se "resource.xml" è in org/pablo/opus, io penso si desidera che questo:

Name.class.getResourceAsStream("org.pablo.opus.resource.xml"); 
1

dove il resource.xml trovato? Se nella radice dell'albero di origine, provare a prefixarlo con /.

+0

Non si trova nella radice dell'albero dei sorgenti. Si trova all'interno di un pacchetto –

+1

quindi considera il nome completo come percorso assoluto, ad esempio com.me.and.u.effects.css sarà accessibile come /com/me/and/u/effects.css – Seffi

1

Io di solito memorizzare file e altre risorse per poi recuperare come URL:

URL url = MyClass.class.getResource("/design/someResource.png"); 

In un contesto statico, o in altro modo:

URL url = getClass().getResource("/design/someResource.png"); 

da un'istanza.

I frammenti di cui sopra presuppongono che il disegno sia una cartella di livello superiore all'interno del contenitore. In generale, se il percorso inizia con una "/" assume un percorso assoluto, altrimenti è relativo dalla posizione della classe.