2012-07-15 18 views
7

Prima di tutto, ho letto molti S.O. domande su questo argomento e ho provato le cose suggerite in loro.Come si deve accedere alle risorse in un vaso compilato?

Ecco la mia situazione. Sto scrivendo un'app Java utilizzando il framework Processing e sono nelle fasi finali in cui ho bisogno di iniziare a pensare a confezionare l'app. Un file jar eseguibile dalla riga di comando è ciò che sto tentando di creare utilizzando la funzione Esporta in Eclipse.

La struttura del mio progetto si presenta così:

src/ 
    multiple packages/ 
libs/ 
    jar files and natives 
data/ 
    fonts and images 
config/ 
    json files 

quando esporto il file jar e uzip il vaso di ispezionare il suo contenuto, trovo che il contenuto di questi dirs sono stati scaricati nel livello più alto del .jar.

che assomiglia a questo:

.jar 
    packages 
    jar files 
    fonts 
    json files 

Così, quando tento di caricare un file di configurazione con qualcosa di simile:

BufferedReader reader = new BufferedReader(new FileReader(path)); 

Tutto funziona proprio file quando corro l'applicazione in Eclipse. Ma il file jar genera uno FileNotFoundException.

Molte delle domande che ho visto su S.O. per quanto riguarda problemi come questi consigliamo di utilizzare utilizzando class.getClass().getResource() o class.getResourceAsStream(). Ho provato entrambe queste utilizzano percorsi relativi e solo il nome del file come in:

class.getResource('config.json'); 
class.getResources('cfg/config.json'); 
class.getResourceAsStream('../../config.json'); 

Tutti questi metodi restituiscono nulla, quando viene eseguito sia da Eclipse o il vaso utilizzando:

java -jar myjarfile.jar 

Sono apri anche all'utilizzo di un file Ant. Infatti, sto utilizzando il file Ant generato dalla funzione di esportazione per creare il jar. Se c'è qualcosa che posso aggiungere a questo per aggiungere le directory nel barattolo sarebbe fantastico.

risposta

5

Per raggiungere le risorse nella radice, anteporre un percorso a /. In caso contrario, lo fai in relazione al pacchetto corrente, che di solito è utile solo se la risorsa è fisicamente accanto alla classe anche nelle tue fonti.

Quindi utilizzare class.getResourceAsStream("/config.json"); per raggiungere config.json nella radice del contenitore.

Si noti inoltre che i barattoli all'interno non sono supportati direttamente.

+0

Grazie per la risposta. Stai suggerendo che io uso la barra diretta in aggiunta a getResource()? – JeremyFromEarth

+0

Questo sembra avvicinarsi molto. Questo è il percorso restituito da: jar: file:/C: /path_to_project/myjarfile.jar! /config.json Tuttavia, quando eseguo il jar, ottengo comunque un file non un'eccezione anche se il percorso è corretto. Dovrei anche menzionare che funziona da dentro Eclipse. – JeremyFromEarth

+1

Non è possibile utilizzare FileReader con risorse all'interno di jar. È necessario utilizzare InputStream restituito da getResourceAsSTream. –

1

Il file .jar deve includere solo le directory relative al "pacchetto" per il codice compilato. Si potrebbe fare riferimento a una struttura .war con/lib/WEB-INF ecc. E questo è diverso.

Se la struttura del pacchetto è:

com.yourco.authentication 

E la classe Login

Allora il vostro vaso dovrebbe essere

/com/ 
    /yourco/ 
    /authentication/ 
     Login.class 

è quindi necessario il .jar nel classpath per l'ENV per eseguire tramite la riga di comando.

Vedo che nota che funziona in Eclipse che probabilmente ha le impostazioni dell'ambiente e le librerie richieste importate, ecc. Così difficile da dire esattamente. Se il pacchetto/cartella include il codice java compilato, non sono sicuro che funzionerà quando viene fatto riferimento esternamente, suggerendo quindi di avviare i pacchetti nella cartella principale.

+0

Vedo altri suggerimenti con la modifica del codice come riferimento /. senza test, potrebbe funzionare ma sembra che tu stia cercando di creare un pacchetto di un'applicazione e non una libreria con la tua struttura di directory. –

Problemi correlati