Runnable Jar ne peuvent pas trouver les Ressources nécessaires et d'Autres Bibliothèques
J'ai créé une application de bureau et j'ai couru dans un problème avec mon généré runnable jar. Tout fonctionne bien dans l'environnement Eclipse, mais quand je génère le pot il ne montre que laswt
composants (menu, onglets, etc..).
Les autres bibliothèques de l'emplacement est une zone vide (bibliothèque pour générer de la galerie). Le même ne semble passet ToolBar
(contenant des boutons avec des images),GoogleMap.html
n'apparaît pas.
Comment puis-je générer correctement un fichier exécutable jar qui comprendra ces sources externes?
De la barre d'outils de l'image code de chargement :
folderSearchIcon = new Image(display, this.getClass().getResourceAsStream("images/search_folder.png"));
GoogleMap.html code de chargement :
File mapFile = new File("resources/GoogleMap.html");
if(!mapFile.exists()) {
System.out.println("File doesn't exist! " + mapFile.getAbsolutePath());
return;
}
Générer runnable jar:
Mon app structure dans Eclipse et jar généré structure:
Généré manifeste :
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
Avez-vous vous assurer que les ressources sont réellement contenue dans le pot? Il suffit de l'ouvrir avec un logiciel d'archivage et de vérifier.
donc
lib
dossier n'est pas inclus dans le pot de droite? Simplement les ajouter à Construire le Chemin à l'aide d'EclipseComme vous pouvez le voir sur le manifeste et la seconde capture d'écran, les bibliothèques de référencé dans le pot.
En fonction de votre capture d'écran, votre pot ne contient pas un
resources
dossier, mais vous l'utilisez pour accéder à la .html
fichier.OriginalL'auteur unixhead | 2012-12-21
Vous devez vous connecter pour publier un commentaire.
Pour la barre d'outils image, vous devez ajouter un slash, c'est à dire au lieu de
vous avez besoin
C'est parce que, comme expliqué dans la documentation Javadoc,
Class.getResourceAsStream
résout les chemins d'accès relatifs à l'encontre de l'ensemble de la classe en question, donc sithis
est uncom.example.Foo
puisgetResourceAsStream("images/search_folder.png")
serait à la recherche decom/example/images/search_folder.png
à l'intérieur de votre POT. Ajoutant la barre oblique ferait-il pourimages/search_folder.png
au lieu de cela, qui est ce que votre capture d'écran suggère que vous avez besoin.Vous aurez besoin d'utiliser une astuce similaire pour le
GoogleMap.html
- vous ne pouvez pas charger les éléments de l'intérieur d'un POT à l'aide dejava.io.File
, mais vous pouvez utiliserthis.getClass().getResource("/GoogleMap.html")
pour obtenir unjava.net.URL
pointant vers le fichier HTML à l'intérieur de votre POT.GoogleMap.html
ne se charge pas en SWT Navigateur (dans Eclipse fonctionne), mais le Navigateur a une connexion avec le réseau,GoogleMap.html
code de chargement :try { URL mapFile = getClass().getResource("/GoogleMap.html"); browserMap = new Browser(compositeTabItemMap, SWT.NONE); browserMap.setUrl(mapFile.toString()); } catch(NullPointerException e) { e.printStackTrace(); }
Dans ce cas, vous pouvez avoir à charger le code HTML sur une chaîne vous-même et utiliser
setText
au lieu desetUrl
. Le SWTBrowser
est un wrapper autour d'un natif du navigateur et peuvent ne pas être en mesure de charger Java spécifiques schémas d'URL.Donc, il n'y a pas d'autre moyen d'exécuter
*.html
fichier dans le bocal ? Il est beaucoup plus facile et plus clairement 🙁J'ai essayé ceci:
InputStream getHtml = getClass().getResourceAsStream("/GoogleMaps.html"); Scanner htmlScanner = new Scanner(getHtml); StringBuffer htmlBuffer = new StringBuffer(); while(htmlScanner.hasNextLine()) { htmlBuffer.append(htmlScanner.nextLine()); } browserMap = new Browser(compositeTabItemMap, SWT.NONE); browserMap.setText(htmlBuffer.toString());
mais google maps ne marche pas de charge dans Eclipse .. j'ai créé simplement un fichier html et a fait de même .. Tn ce cas, il travaille dans Eclipse mais dans runnable jar toujours la même situtation que avec GoogleMap.htmltout simplement la solution 🙂 : java ne peut pas charger fichier html à partir des fichiers jar, car il doit être décompressé à la température de fichier dans le fichier sys. emplacement, donc j'ai changé
.html
à.txt
aussi j'ai ajouté\n
dansappend
méthode à valider correctement le code javascript et il fonctionne très belleOriginalL'auteur Ian Roberts
J'ai perdu de nombreuses heures sur ce même sujet. Si vous avez créé votre runnable jar en utilisant les options de la fonction "Exporter" de la fonctionnalité dans Eclipse, il juste ne fonctionnera pas. Au moins il n'a pour moi. N'importe quel nombre d'options que j'ai essayé, rien n'a fonctionné. Lorsque vous essayez de lire les ressources, la resourceUrl serait de retourner la valeur null. Enfin, j'ai décidé de créer l'exécutable jar à l'aide de Maven, et de laisser l'Éclipse aide genre de côté. J'avais besoin d'avoir la charge des bocaux dans un autre dossier lib. J'ai créé le runnable jar comme expliqué dans http://www.mkyong.com/maven/how-to-create-a-manifest-file-with-maven/ et la solution a fonctionné pour moi. D'une certaine manière, lors de l'Éclipse crée l'exécutable jar paquet, les ressources ne peuvent pas être lus, même s'ils sont présents dans le fichier jar. Espérons que cela aidera d'autres.
OriginalL'auteur DDRider62
Comme vous pouvez le voir ici:
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html#getResourceAsStream(java.lang.String)
getResourceAsStream() recherche le fichier dans le même package que la classe à partir de laquelle il est appelé. Donc, il va chercher un fichier nommé "com/quel que soit/plus/images/search_folder.png" intérieur du POT, ce qui bien sûr ne pas exister, parce que le contenu de la rubrique "ressources" du répertoire sont mis directement à la racine du fichier JAR par le POT de l'exportateur.
Utilisation http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html#getResourceAsStream(java.lang.String) à la place.
La deuxième partie: lorsque vous chargez le HTML ne marchera jamais. Vous essayez de trouver un Fichier nommé "resources/GoogleMap.html" mais qui va chercher à l'extérieur du BOCAL, dans le répertoire de travail de votre programme java processus. Vous devriez utiliser la fonction précédente pour charger le code HTML:
http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html#getResourceAsStream(java.lang.String)
ClassLoader.getSystemClassLoader().getResourceAsStream("file.txt");
OriginalL'auteur izaera
Depuis exportation dans un runnable jar essentiel de créer un fichier, le fichier/image/ressource dans votre dossier de ressources ne peut plus être trouvé avec FileReader parce que l'emplacement du fichier est maintenant inexistant..
Évolution de l'utilisation de
FileReader fr = new FileReader(resource_file_path)
de chargement avec un InputStream,InputStream is = getClass().getResourceAsStream(resource_file_path)
puis à l'aide d'unInputStreamReader
à fait d'utiliser les ressources dans d'autres endroits. Espérons que cette aide.OriginalL'auteur Corey Byrum