2010-07-22 4 views
2

Mon installation du projetJava: Chargement des ressources du système de fichiers

je la configuration du projet suivant:

\program.jar 
\images\logo.png 

Dans mon code, je référence à l'image avec l'URL relative "images/logo.png".

Problème

Si je lance ce programme avec la commande suivante alors que dans le répertoire:

c:\projects\program_dir\bin\>java -jar program.jar 

Ensuite, tout fonctionne et Java est capable de localiser l'image. Maintenant, mon problème est que je dois être capable d'exécuter le programme à partir d'un répertoire différent.

c:\>java -jar c:\projects\program_dir\bin\program.jar 

Le programme est exécuté, mais maintenant toutes les URL relatives ne fonctionnent plus.

Ce que je dois

Comment calculer la maison d'exécution du fichier program.jar, de sorte que je peux changer mes URL relatives en URL absolues?

Répondre

9

Ce que je ferais, si possible, est d'emballer vos images avec votre pot. De cette façon, vous n'avez pas à vous soucier de l'endroit où votre Jar est lancé.

Vous aurez alors besoin de charger des images similaires à ce qui suit:

InputStream stream = this.getClass().getClassLoader(). 
            getResourceAsStream("/images/logo.png"); 
+0

+1 Utilisez le classpath pour charger les ressources statiques. Voir aussi: http://stackoverflow.com/questions/861500/url-to-load-resources-from-the-classpath-in-java, http://stackoverflow.com/questions/3294196/load-resource -from-anywhere-in-classpath, http://stackoverflow.com/questions/1900154/classpath-resource-within-jar –

0

Les ressources doivent être dans le chemin de classe (s). Vous pouvez essayer l'une d'entre elles:

  1. Positionnement des images dans program.jar. Comme la plupart des programmes, ils ont un répertoire APP_HOME, par ex. MAVEN_HOME, enregistrez-le et faites référence à vos fichiers en tant que File à la place - $APP_HOME/the-file.ext (avec System.getenv()).
1

Vous devriez vraiment inclure vos ressources dans votre fichier JAR. A défaut, vous pouvez analyser le chemin absolu hors de la ressource de la classe Main. En supposant que votre classe principale est en fait appelé « Main »:

Main.class.getResource("Main.class").getPath(); 
0

Comme Nelson mentionné, les package avec votre JAR (il suffit de les copier à côté de vos fichiers .class), vous pouvez les trouver via un this.getClass().getClassLoder().getResource("images/foo.png") simple.

0

Vous devez ajouter un paramètre qui décrit votre chemin de classe.Doit ressembler à quelque chose comme

java -cp c:\projects\program_dir\bin -jar program.jar 

cela mettra votre pot et l'image sur le chemin de la classe et il se chargera avec succès.

+0

Ceci est en fait faux ([documentation java] (http://docs.oracle.com/javase /7/docs/technotes/tools/solaris/java.html)): '-jar Lorsque vous utilisez cette option, le fichier JAR est la source de toutes les classes d'utilisateurs et les autres paramètres de chemin de classes d'utilisateurs sont ignorés. – nachteil

Questions connexes