2009-12-14 11 views
19

Ho un progetto A, che contiene alcuni file java e una risorsa di percorso di classe R.txt. All'interno del progetto io uso ClassLoader.getSystemResource ("R.txt"); recuperare R.txt.Risorsa del percorso di classe nel barattolo

Quindi ho un progetto B che include il file jar del progetto A. Ora getSystemResource ("R.txt") non troverà il file di testo (e sì, è ancora nella radice del file jar). Anche provare "/R.txt" come suggerito su qualche altro sito non ha funzionato. Qualche idea?

risposta

42

Utilizzare getResource anziché getSystemResource per utilizzare una risorsa specifica per un determinato classloader anziché per il sistema. Ad esempio, provare una delle seguenti:

URL resource = getClass().getClassLoader().getResource("R.txt"); 
URL resource = Foo.class.getClassLoader().getResource("R.txt"); 
URL resource = getClass().getResource("/R.txt"); 
URL resource = Foo.class.getResource("/R.txt"); 

Nota la barra di primo piano quando si chiama Class.getResource invece di ClassLoader.getResource; Class.getResource è relativo al pacchetto che contiene la classe a meno che non si abbia una barra iniziale, mentre ClassLoader.getResource è sempre assoluto.

+0

Incredibile. Questo ha completamente risolto il mio problema. Grazie per l'input superveloce // Johan –

+0

Un'altra domanda correlata: potremmo ottenere InputStream da queste risorse URL, ma come possiamo creare un oggetto ** File ** dall'oggetto URL restituito. Ho provato a creare un oggetto ** URI ** con "URLObject.toURI()", e utilizzare questo oggetto URI per creare un file, sfortunatamente getta un "URI non è un'eccezione gerarchica". Potresti darmi un aiuto? Molte grazie . –

+2

@EnsomHodder: Uhm, non sono sicuro - ma non tutte le risorse * sono * file - in particolare, non lo sarà se si trova in un file jar. –

5

Apparentemente il tuo JAR non è stato caricato dal programma di caricamento di classe del sistema, quindi getSystemResource() non può funzionare. Questo dovrebbe funzionare:

ClassFromProjectA.class.getClassLoader().getResource("R.txt") 

IMO più conveniente sta mettendo risorse all'interno dello stesso pacchetto, come le classi che ne fanno uso, in modo da poter utilizzare il più breve

ClassFromProjectA.class.getResource("R.txt") 

(o, all'interno di quella classe solo getClass().getResource("R.txt"))

2

ClassLoader.getResource() funziona? Al momento stai semplicemente specificando che il classloader di sistema deve essere usato.

+0

Funziona come un incantesimo. Dovevo solo usare il classloader corretto :) –

Problemi correlati