J'essaie de trouver un chemin vers une ressource mais je n'ai pas eu de chance.
Cela fonctionne (à la fois dans l'IDE et avec le JAR) mais de cette façon, je ne peux pas obtenir un chemin vers un fichier, seulement le contenu du fichier:
ClassLoader classLoader = getClass().getClassLoader();
PrintInputStream(classLoader.getResourceAsStream("config/netclient.p"));
Si je fais ceci:
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("config/netclient.p").getFile());
Le résultat est:
java.io.FileNotFoundException: file:/path/to/jarfile/bot.jar!/config/netclient.p (No such file or directory)
Existe-t-il un moyen d'obtenir un chemin vers un fichier de ressources?
Réponses:
C'est délibéré. Le contenu du "fichier" peut ne pas être disponible sous forme de fichier. N'oubliez pas que vous avez affaire à des classes et des ressources qui peuvent faire partie d'un fichier JAR ou d'un autre type de ressource. Le chargeur de classe n'a pas à fournir de descripteur de fichier à la ressource, par exemple le fichier jar n'a peut-être pas été développé en fichiers individuels dans le système de fichiers.
Tout ce que vous pouvez faire en obtenant un fichier java.io.File peut être fait en copiant le flux dans un fichier temporaire et en faisant de même, si un fichier java.io.File est absolument nécessaire.
la source
Lors du chargement d'une ressource, assurez-vous de noter la différence entre:
et
Je suppose que cette confusion est à l'origine de la plupart des problèmes lors du chargement d'une ressource.
De plus, lorsque vous chargez une image, il est plus facile à utiliser
getResourceAsStream()
:Lorsque vous devez vraiment charger un fichier (non-image) à partir d'une archive JAR, vous pouvez essayer ceci:
la source
bin
dossier et allez dans le répertoire de la classe se chargeant dans les ressources avant d'utiliser le chemin `/com/myorg/filename.ext '.La réponse en une ligne est -
Fondamentalement, la
getResource
méthode donne l'URL. Depuis cette URL, vous pouvez extraire le chemin en appelanttoExternalForm()
Références:
getResource () , toExternalForm ()
la source
file:/
au chemin, qui fonctionne dans jar mais pas dans IDEJ'ai passé un moment à déconner avec ce problème, car aucune solution que j'ai trouvée ne fonctionnait, assez étrangement! Le répertoire de travail n'est souvent pas le répertoire du JAR, surtout si un JAR (ou tout autre programme, d'ailleurs) est exécuté à partir du menu Démarrer sous Windows. Voici donc ce que j'ai fait, et cela fonctionne aussi bien pour les fichiers .class exécutés depuis l'extérieur d'un JAR que pour un JAR. (Je l'ai testé uniquement sous Windows 7.)
la source
s'il se
netclient.p
trouve dans un fichier JAR, il n'aura pas de chemin car ce fichier se trouve dans un autre fichier. dans ce cas, le meilleur chemin que vous pouvez avoir est vraimentfile:/path/to/jarfile/bot.jar!/config/netclient.p
.la source
Vous devez comprendre le chemin dans le fichier jar.
Faites simplement référence à lui relatif. Donc, si vous avez un fichier (myfile.txt), situé dans foo.jar sous le
\src\main\resources
répertoire (style maven). Vous y feriez référence comme:Si vous videz votre
jar -tvf myjar.jar
fichier jar en utilisant, vous verrez la sortie et le chemin relatif dans le fichier jar, et utilisez les barres obliques FORWARD.la source
File.separator
.Dans mon cas, j'ai utilisé un objet URL à la place Path.
Fichier
Ressource dans classpath à l'aide du classloader
Lorsque j'ai besoin de lire le contenu, je peux utiliser le code suivant:
Et vous pouvez accéder au contenu à l'aide d'un InputStream.
la source
Il s'agit du même code de l'utilisateur Tombart avec vidage et fermeture du flux pour éviter une copie incomplète du contenu du fichier temporaire à partir de la ressource jar et pour avoir des noms de fichier temporaires uniques.
la source
Un fichier est une abstraction pour un fichier dans un système de fichiers, et les systèmes de fichiers ne savent rien du contenu d'un JAR.
Essayez avec un URI, je pense qu'il existe un protocole jar: // qui pourrait être utile pour vos objectifs.
la source
Le chemin suivant a fonctionné pour moi:
classpath:/path/to/resource/in/jar
la source
Obtenir ceci
getSystemResourceAsStream
est la meilleure option. En obtenant le flux d'entrée plutôt que le fichier ou l'URL, fonctionne dans un fichier JAR et de manière autonome.la source
Il est peut-être un peu tard mais vous pouvez utiliser ma bibliothèque KResourceLoader pour obtenir une ressource de votre jar:
la source
Lorsqu'elle se trouve dans un fichier jar, la ressource se trouve absolument dans la hiérarchie du package (et non dans la hiérarchie du système de fichiers). Donc, si vous avez la classe com.example.Sweet chargeant une ressource nommée "./default.conf" alors le nom de la ressource est spécifié comme "/com/example/default.conf".
Mais si c'est dans un pot, ce n'est pas un fichier ...
la source
Dans votre dossier ressources (java / main / resources) de votre jar, ajoutez votre fichier (nous supposons que vous avez ajouté un fichier xml nommé imports.xml ), après cela vous injectez
ResourceLoader
si vous utilisez spring comme ci-dessousà l'intérieur de la fonction tour écrivez le code ci-dessous afin de charger le fichier:
la source
Peut-être que cette méthode peut être utilisée pour une solution rapide.
la source
java.lang.NullPointerException: Attempt to invoke virtual method 'java.security.CodeSource java.security.ProtectionDomain.getCodeSource()' on a null object reference
suivez le code!
/ src / main / resources / fichier
la source