So laden Sie eine Ressource aus einer JAR-Datei eingebettet
Ich versuche zu laden eine Ressource, die in einer integrierten JAR-Datei. Das Projekt ist tatsächlich genutzt JBoss mit einem OHR - Datei mit der folgenden Struktur:
deploy.ear
|
|-> project.sar
|
|-> sub_project.jar
| |
| |-> settings.xml
|
|-> com/path/project/
|
|-> main.class
Vom main.java
ich würde gerne eine InputStream
für settings.xml
. Was ist der richtige Weg, dies zu tun?
Meinem aktuellen Verständnis, dass der folgende code sollte funktionieren, aber es ist wieder null
:
this.getClass().getResourceAsStream("settings.xml");
Update
Nachdem einige Versuch und Irrtum, sind die folgenden Anweisungen Arbeit:
getClass().getResourceAsStream("/settings.xml");
getClass().getResourceAsStream("/sub_project.jar/settings.xml");
getClass().getClassLoader().getResourceAsStream("/settings.xml");
getClass().getClassLoader().getResourceAsStream("settings.xml");
getClass().getClassLoader().getResourceAsStream("sub_project.jar/settings.xml");
getClass().getClassLoader().getResourceAsStream("/sub_project.jar/settings.xml");
- der java class loader kann nicht geladen werden die Ressourcen von embedded-Gläser, damit Sie Ihre set-up wird nicht funktionieren. Die Glas-Lösung die dieses problem behebt, finden Sie Eran Antwort.
- Nicht sicher, dass /sub_project.jar/settings.xml ist eine standard-notation. Könnte JBoss-Erweiterung.
- Ich war überrascht, warum "settings.xml" gescheitert ist, während "/settings.xml" gearbeitet, aber dann habe ich Lesen Sie die Dokumentation: wenn die Ressource-name beginnt mit "/", es ist unverändert; andernfalls wird der package-name vorangestellt, um die Ressource namens nach der Konvertierung von "." auf "/". Class.class tut dies, aber ClassLoader.class nicht. Etwas neues gelernt heute...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte dies eine gute Ressource: http://one-jar.sourceforge.net/version-0.95/
Die Grundidee ist, dass der innere Behälter wird nicht geladen vom ClassLoader geladen, dass die äußeren JAR automatisch, Sie brauchen, um dies manuell, z.B. mit einem
StreamClassLoader
zu laden, die innere GlasNur danach, von Ihrem eigenen ClassLoader, die Sie bekommen können, dass die Ressource mit
getResourceAsStream(...)
edited [time]
link unterhalb der Frage für das detail.