Estoy intentando cargar un recurso que está contenido en un archivo JAR incrustado. El proyecto se despliega en realidad JBoss mediante un archivo EAR con la siguiente estructura:Cómo cargar un recurso de un archivo JAR incrustado
deploy.ear
|
|-> project.sar
|
|-> sub_project.jar
| |
| |-> settings.xml
|
|-> com/path/project/
|
|-> main.class
De main.java
me gustaría obtener una InputStream
para settings.xml
. ¿Cuál es la forma correcta de hacer esto?
Mi comprensión actual de que el siguiente código debería funcionar, pero está volviendo null
:
this.getClass().getResourceAsStream("settings.xml");
actualización
Después de un poco de ensayo y error, las siguientes sentencias funcionan:
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");
el cargador de clases Java no puede cargar los recursos de los frascos incrustados, por lo que su puesta en marcha no lo hará trabajo. La única solución de jar resuelve este problema, vea la respuesta de Eran. – MeBigFatGuy
No estoy seguro de que /sub_project.jar/settings.xml sea una notación estándar. Podría ser la extensión JBoss. –
Me sorprendió por qué "settings.xml" falló, mientras "/settings.xml" funcionó, pero luego he leído la documentación: * si el nombre del recurso comienza con "/", no se modifica; de lo contrario, el nombre del paquete se antepone al nombre del recurso después de convertir "." a "/".* Class.class hace esto, pero ClassLoader.class no lo hace. Aprendí algo nuevo hoy ... –