Comment référencer une ressource correctement un fichier JAR et le Débogage?
J'ai un méchant problème de référencement des ressources lors de l'utilisation d'un projet Maven et les fichiers Jar...
J'ai toutes mes ressources dans un dossier dédié /src/main/resources qui est la partie de la construction de chemin d'accès dans Eclipse. Les fichiers sont référencés à l'aide d'
getClass().getResource("/filename.txt")
Cela fonctionne bien dans Eclipse, mais échoue dans le fichier Jar - là, les ressources sont situées dans un dossier directement en dessous du pot de racine...
Personne ne sait une "meilleure pratique" pour faire référence à un fichier à la fois dans le POT et (!) dans Eclipse?
Edit:
Le problème est que, si les ressources sont en fait situé dans le JAR dans un dossier "ressources" au plus haut niveau, la méthode ci-dessus ne parvient pas à trouver le fichier...
- Qu'est-ce que le dossier qui est utilisé dans le fichier jar? /ressources ?
- Cela fonctionne bien dans Eclipse, mais échoue dans le fichier Jar - là, les ressources sont situées dans un dossier directement en dessous du pot de racine... ce qui est exactement ce qui doit arriver. Où est le problème?
- Vous devriez être en développement de la même façon si l'exécution de votre code à partir d'un IDE ou de "la JARRE" - c'est à dire, si vous vous attendez à charger les ressources de la classpath dans votre IDE, vous devriez être en mesure de charger les ressources de la classpath lors de l'exécution à l'extérieur de l'entreprise!
- Le exactement de la même ligne(également à l'aide du fichier de l'époque) lève une Exception (NullPointer) - si le fichier n'est pas trouvé... Bien que physiquement il est là!
Vous devez vous connecter pour publier un commentaire.
Le contenu de Maven dossiers de ressources sont copiés dans target/classes et à partir de là à la racine de l'résultant fichier Jar. C'est le comportement attendu.
Ce que je ne comprends pas est ce que le problème est dans votre scénario. Le référencement d'une Ressource par le biais de
getClass().getResource("/filename.txt")
commence à la racine du classpath, qu' (ou un de ses éléments) esttarget/classes
ou le POT de la racine. La seule erreur que je vois est que vous utilisez le mauvaisClassLoader
.Assurez-vous que la classe qui utilise la ressource est dans le même artefact (JAR) en tant que ressource et ne
ThatClass.class.getResource("/path/with/slash")
ouThatClass.class.getClassLoader().getResource("path/without/slash")
.Mais en dehors de cela: si cela ne fonctionne pas, vous avez probablement fait quelque chose de mal, quelque part dans le processus de construction. Pouvez-vous vérifier que la ressource est dans le POT?
J'ai eu un problème similaire.
Après une journée entière à essayer toutes les combinaisons et le débogage, j'ai essayé getClass().getResourceAsStream("resources/filename.txt") et il a obtenu de travailler enfin.
Rien d'autre a aidé.
getResourceAsStream
est en fait vaut la peine d'essayer, non seulement pour éventuellement raccourcir votre code. Pour moiThatClass.class.getClassLoader().getResourceAsStream("filename.txt")
travaillé. La préfixation de "ressources" ne fait pas de sens pour moi que le fichier a été copié à la racine de la JARRE. Une chose à retenir, c'est quegetResourceAsStream
ne jette pas des exceptions, mais renvoie la valeur null si le fichier ne peut pas être trouvé.Une fois que vous emballez le POT, vos fichiers de ressources ne sont pas plus de fichiers, mais stream, donc
getResource
ne fonctionnera pas!Utilisation
getResourceAsStream
.Pour obtenir le "fichier" contenu, de l'utilisation https://commons.apache.org/proper/commons-io/javadocs/api-release/org/apache/commons/io/IOUtils.html:
getResource
ne fonctionne pas et les listes de l'alternative, si vous avez besoin d'eux, mais franchement, en l'enveloppant dansInputStreamReader
fonctionne très bien.Peut-être que cette méthode peut aider dans certaines situations.
Si vous ajoutez le répertoire des ressources dans le fichier jar (c'est donc en vertu de l' /dossier de ressources dans le pot, et si /src/main est dans votre chemin de génération dans eclipse, alors vous devriez être en mesure de référencer votre fichier:
Qui devrait fonctionner dans les deux environnements.
Le problème est que dans l'IDE, le getClass().getResource("Chemin"); String n'est pas SENSIBLE à la casse lors de l'accès à un fichier, mais lors de l'exécution à partir d'un pot de il est. Vérifiez vos Capitalisation sur le répertoire par rapport à un fichier. Il ne fonctionne pas. Aussi, si vous essayez nouveau Fichier(getClass().getResource("Chemin"); le fichier ne sera pas lisible à l'extérieur de l'IDE.
Il suffit de copier le fichier dans un répertoire temporaire.