616 votes

Comment faire pour obtenir le chemin d’accès d’un fichier JAR en cours d’exécution ?

Mon exécution du code à l’intérieur d’un fichier JAR, dire foo.jar, et j’ai besoin de savoir, dans le code, dans quel dossier est le foo.jar en cours d’exécution.

Donc, si foo.jar est en `` , je veux obtenir ce chemin d’accès quel que soit mon répertoire de travail courant.

582voto

Zarkonnen Points 11086
<pre><code></code><p>De toute évidence, cela va faire des choses bizarres si votre classe a été chargé à partir d’un emplacement de fichier.</p></pre>

197voto

Fab Points 1099

Meilleure solution pour moi :

Cela devrait résoudre le problème avec les espaces et caractères spéciaux.

169voto

ctrueden Points 1292

Pour obtenir l' File , pour un Class, il y a deux étapes:

  1. Convertir l' Class d'un URL
  2. Convertir l' URL d'un File

Il est important de comprendre à la fois des mesures, et non pas l'amalgame entre eux.

Une fois que vous avez l' File, vous pouvez appeler getParentFile pour obtenir le dossier contenant, si c'est ce que vous avez besoin.

Étape 1: Class de URL

Comme discuté dans d'autres réponses, il y a deux grandes façons de trouver un URL pertinent pour un Class.

  1. URL url = Bar.class.getProtectionDomain().getCodeSource().getLocation();

  2. URL url = Bar.class.getResource(Bar.class.getSimpleName() + ".class");

Les deux ont des avantages et des inconvénients.

L' getProtectionDomain approche donne l'emplacement de la base de la classe (par exemple, le fichier JAR contenant). Toutefois, il est possible que le runtime Java de la politique de sécurité de jeter SecurityException lors de l'appel d' getProtectionDomain(), donc si votre application a besoin pour fonctionner dans une variété d'environnements, il est préférable de le tester dans tous les d'entre eux.

L' getResource approche donne l'URL complète chemin d'accès aux ressources de la classe, à partir de laquelle vous devrez effectuer supplémentaires de manipulation de chaîne. Il peut être un file: chemin, mais il pourrait aussi être jar:file: ou même quelque chose de plus méchant comme bundleresource://346.fwk2106232034:4/foo/Bar.class lors de l'exécution à l'intérieur d'un framework OSGi. À l'inverse, l' getProtectionDomain approche correctement donne un file: URL de même à partir d'OSGi.

Notez que les deux getResource("") et getResource(".") a échoué dans mes tests, lorsque la classe se trouvaient à l'intérieur d'un fichier JAR; les deux invocations retourné null. Je recommande donc le n ° 2 de l'invocation indiqué ci-dessus au lieu de cela, comme il semble plus sûr.

Étape 2: URL de File

De toute façon, une fois que vous avez un URL, la prochaine étape est de les convertir à un File. C'est son propre défi; voir kohsuke nous Kawaguchi blog post à ce sujet pour plus de détails, mais en bref, vous pouvez utiliser new File(url.toURI()) tant que l'URL est complètement bien formé.

Enfin, je voudrais décourage fortement l'aide d' URLDecoder. Certains caractères de l'URL, : et / en particulier, ne sont pas valides URL caractères encodés. À partir de la URLDecoder Javadoc:

Il est supposé que tous les caractères de la chaîne codée est l'un des suivants: "a" à "z", "A" à "Z", "0" à "9", et "-", "_", ".", et "*". Le caractère "%" est autorisée, mais est interprété comme le début d'une échappé à la séquence.

...

Il y a deux façons possibles de ce décodeur peut traiter illégale des chaînes de caractères. Il pourrait laisser des caractères illégaux seul, ou qu'il pourrait jeter une IllegalArgumentException. Qui approche le décodeur prend est laissé à la mise en œuvre.

Dans la pratique, URLDecoder généralement ne pas jeter IllegalArgumentException menacées ci-dessus. Et si votre chemin d'accès de fichier avec des espaces encodé %20, cette approche peut sembler fonctionner. Toutefois, si votre chemin d'accès du fichier à d'autres fins non alphameric des caractères tels que + vous avez des problèmes avec l' URLDecoder d'amputation votre chemin d'accès au fichier.

64voto

Benny Neugebauer Points 5393
Vous pouvez également utiliser

27voto

Jon Skeet Points 692016

Utilisez ClassLoader.getResource() pour trouver l’URL de votre classe en cours.

Par exemple :

(Cet exemple tiré d’une question similaire).

Pour trouver le répertoire, vous devez alors démonter manuellement l’URL. Voir le tutoriel de JarClassLoader pour le format d’une URL jar.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X