2014-10-31 11 views
7
ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
URL url = classLoader.getResource("com/x/y/z.cfg"); 
File file = new File(url.getPath()); 

Questo funziona quando si esegue il file jar da Eclipse ma non funziona quando si esegue in un file jar.classLoader.getResource non funziona nel file jar

java.io.FileNotFoundException: file: \ C: \ Users \ nova \ Desktop \ Matcher.jar \ c om \ x \ y \ z.cfg

Questo non è un duplicato Ho controllato tutte le altre domande, nessuna informazione utile.

+1

Cosa vuoi fare con quel 'File' una volta che ce l'hai? Non puoi creare un 'File' dall'URL' che ottieni per una risorsa in un JAR (perché non è un file':: URL, tipicamente 'jar: file: /path/to/file.jar!/it/x/y/z.cfg'), ma se l'API che stai utilizzando può accettare un 'URL' o un' InputStream' invece di un 'File', non è necessario. –

+6

Questo è spiegato più volte: [qui] (http://stackoverflow.com/questions/944610/how-do-i-access-a-config-file-inside-the-jar), [qui] (http: //stackoverflow.com/questions/20389255/java-reading-a-resource-file-from-within-jar), [qui] (http://stackoverflow.com/questions/403256/how-do-i-read -a-resource-file-da-un-java-jar-lima? RQ = 1). Il reson è proprio perché File rappresenta un oggetto file system e il contenuto di jar non è accessibile dal file system (ma Java può gestirlo in qualche modo - come InputStream). –

+0

URL.getFile() * non * converte un URL in un percorso file valido. Restituisce semplicemente la porzione di percorso dell'URL. (Nei giorni di Java 1.0, la maggior parte degli URL si riferiva a file fisici, ecco perché il metodo si chiama getFile.) – VGR

risposta

11

Quando il file viene inserito nel contenitore, diventa un flusso di byte anziché un normale oggetto File.

Prova

InputStream stram=getClass().getClassLoader().getResourceAsStream(relativePath); 

More Tutorial...

Leggi post simile here e here

1

Non è possibile creare un'istanza di file, in quanto l'unico file che hai è il JAR. Ecco perché getResource() restituisce l'URL. È possibile ottenere lo stream utilizzando il metodo URL.openStream() per leggere i contenuti.

Problemi correlati