Domanda Il jar eseguibile non riesce a trovare risorse e altre librerie


Ho creato un'applicazione per desktop e ho riscontrato un problema con il mio jar eseguibile generato. Tutto funziona bene nell'ambiente Eclipse, ma quando genero il barattolo mostra solo ilswtcomponenti (menu, schede, ecc.). L'altra posizione delle librerie è un'area vuota (libreria per generare una galleria). Lo stesso non sembraset ToolBar(contenente pulsanti con immagini),GoogleMap.htmlnon appare.

Come posso generare correttamente un jar eseguibile che includa queste fonti esterne?

Codice caricamento immagine barra degli strumenti:

folderSearchIcon = new Image(display, this.getClass().getResourceAsStream("images/search_folder.png"));

Codice di caricamento di GoogleMap.html:

File mapFile = new File("resources/GoogleMap.html");        
if(!mapFile.exists()) {
    System.out.println("File doesn't exist! " + mapFile.getAbsolutePath()); 
    return;
}

Generazione del barattolo scorrevole:

enter image description here

La mia struttura dell'app in Eclipse e la struttura del jar generata:

enter image description here

Manifest manifestato:

Manifest-Version: 1.0
Rsrc-Class-Path: ./ swt.jar commons-imaging-1.0-SNAPSHOT.jar org.eclip
  se.nebula.widgets.gallery_0.5.3.201210262156.jar xmpcore.jar metadata
  -extractor-2.6.3.jar
Class-Path: .
Rsrc-Main-Class: geotagger.AppInit
Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader

11
2017-12-21 12:00


origine


risposte:


Per l'immagine della barra degli strumenti è necessario aggiungere una barra, vale a dire anziché

this.getClass().getResourceAsStream("images/search_folder.png")

hai bisogno

this.getClass().getResourceAsStream("/images/search_folder.png")

Questo è perché, come spiegato in JavaDocs, Class.getResourceAsStream risolve i percorsi relativi contro il pacchetto della classe in questione, quindi se this è un com.example.Foo poi getResourceAsStream("images/search_folder.png") cercherei com/example/images/search_folder.png dentro il tuo JAR. Prevedendo la barra lo farebbe cercare images/search_folder.png invece, che è quello che ti suggerisce il tuo screenshot.

Dovrai usare un trucco simile per il GoogleMap.html - Non è possibile caricare gli oggetti da un JAR usando java.io.File, ma potresti usare this.getClass().getResource("/GoogleMap.html") prendere un java.net.URL indicando il file HTML all'interno del tuo JAR.


9
2017-12-21 12:38



Ho perso molte ore su questo stesso problema. Se hai creato il tuo jar eseguibile usando le opzioni nella funzionalità "Esporta" in Eclipse, non funzionerà. Almeno non lo faceva per me. Non importa quale numero di opzioni ho provato, non ha funzionato. Durante il tentativo di leggere le risorse, resourceUrl restituisce null. Alla fine, ho deciso di creare il barattolo eseguibile usando Maven e lasciare l'aiuto gentile di Eclipse a parte. Avevo bisogno di avere i giare dipendenti in una cartella lib separata. Ho creato il barattolo eseguibile come spiegato in http://www.mkyong.com/maven/how-to-create-a-manifest-file-with-maven/ e la soluzione ha funzionato per me. In qualche modo, quando Eclipse crea il pacchetto jar eseguibile, le risorse non possono essere lette, anche se sono presenti nel file jar. Spero che questo aiuti gli altri.


3
2017-11-12 16:19



Come puoi vedere qui:

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html#getResourceAsStream(java.lang.String)

getResourceAsStream () cerca il file nello stesso pacchetto della classe da cui viene chiamato. Così cercherà un file chiamato "com / whatever / more / images / search_folder.png" all'interno del JAR, che ovviamente non esisterà, perché i contenuti della directory "resources" sono messi direttamente nella root del File JAR dall'esportatore JAR.

Uso http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html#getResourceAsStream(java.lang.String) anziché.

La seconda parte: quando carichi l'HTML non funzionerà mai. Si tenta di trovare un file denominato "resources / GoogleMap.html", ma che verrà visualizzato all'esterno del JAR, nella directory di lavoro del processo del programma java. Dovresti utilizzare nuovamente la funzione precedente per caricare l'HTML:

http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html#getResourceAsStream(java.lang.String)


3
2017-12-21 12:44



Poiché l'esportazione in un jar eseguibile crea essenzialmente un file, il file / immagine / risorsa nella cartella delle risorse non può più essere trovato con FileReader perché il percorso del file è ora inesistente.

Passaggio dall'uso FileReader fr = new FileReader(resource_file_path) al caricamento con un InputStream, InputStream is = getClass().getResourceAsStream(resource_file_path) e quindi usando un InputStreamReader per utilizzare effettivamente la risorsa in altre posizioni. Spero che questo ti aiuti.


0
2017-10-22 16:03