2010-09-08 13 views
3

J'ai besoin de lire un fichier XML externe de mon application java dans le fichier exécutable jar.
Si je le déjeune à partir de la console (java -jar package.jar) cela fonctionne très bien, mais si je le déjeune en double-cliquant (programme binaire Java Platform SE) cela ne fonctionne pas.
J'ai ce problème avec le chemin relatif. Avec le chemin absolu, il fonctionne dans les deux sens.Comment lire le fichier xml externe à partir du fichier jar

Répondre

3

Vous devez ajouter le chemin (relatif à JAR) à la mosaïque XML à l'entrée Class-Path dans le fichier MANIFEST.MF. Cette entrée contient des informations sur le chemin d'accès aux classes d'exécution du JAR. En supposant que vous souhaitez avoir le XML dans le même dossier que le fichier JAR lui-même, ce qui suit suffit:

Class-Path: . 

(ne pas oublier de mettre une ligne vide à la fin du fichier MANIFEST.MF)

Ensuite, vous pouvez l'obtenir en tant que ressource de chemin de classe en utilisant Class#getResource() ou ClassLoader#getResource(). Le premier suffit dans votre cas.

URL xmlResource = getClass().getResource("/filename.xml"); 
File xmlFile = new File(xmlResource.getPath()); 
// ... 
1

Ajoutez ce fichier au chemin de classe dans votre manifeste JAR et lisez-le en tant que flux d'entrée.

+0

Comment puis-je ajouter? – enfix

+0

Je l'ai déjà lu (db.parse (new File (filePath))), mais j'ai besoin de modifier donc je ne peux pas l'inclure dans le fichier jar. – enfix

+0

Non, pas FilePath - c'est fragile et sujet aux erreurs. getResourceAsStream() est la bonne façon de lire. L'édition et l'écriture sont différentes. – duffymo

0
(new File(".")).getAbsolutePath(); 

Doit vous donner le chemin du pot. Imprimez-le pour vérifier, puis construisez votre chemin relatif sur celui-ci.

+1

Cela retournera le répertoire de travail actuel, pas le chemin du fichier jar. – gawi

0

Il est difficile de donner une réponse précise sans savoir quel système d'exploitation que vous utilisez.

La réponse générale serait de modifier votre lanceur (l'icône sur le bureau) afin de spécifier le répertoire de travail initial pour être le même que celui que vous utilisez lorsque vous exécutez la commande à partir d'un shell.