Luego de consultar expertos en esta materia, programadores de varias ramas y profesores hemos dado con la solución al dilema y la plasmamos en esta publicación.
Solución:
Lifepaths.class.getClass().getResourceAsStream(...)
carga recursos usando el cargador de clases del sistema, obviamente falla porque no ve sus JAR
Lifepaths.class.getResourceAsStream(...)
carga recursos usando el mismo cargador de clases que cargó la clase Lifepaths y debería tener acceso a los recursos en sus JAR
Las reglas son las siguientes:
- verifique la ubicación del archivo que desea cargar dentro del JAR (y, por lo tanto, también asegúrese de que realmente se haya agregado al JAR)
- use una ruta absoluta: la ruta comienza en la raíz del JAR
- use una ruta relativa: la ruta comienza en el directorio del paquete de la clase a la que está llamando getResource/ getResoucreAsStream
Y prueba:
Lifepaths.class.getResourceAsStream("/initialization/Lifepaths.txt")
en vez de
Lifepaths.class.getClass().getResourceAsStream("/initialization/Lifepaths.txt")
(No estoy seguro de si hace una diferencia, pero el primero usará el ClassLoader/JAR correcto, mientras que no estoy seguro con el último)
Entonces, hay varias formas de obtener un recurso de un jar y cada una tiene una sintaxis ligeramente diferente donde la ruta debe especificarse de manera diferente.
La mejor explicación que he visto es este artículo de InfoWorld. Lo resumiré aquí, pero si quieres saber más, deberías revisar el artículo.
Métodos
ClassLoader.getResourceAsStream()
.
Formato: nombres separados por “/”; sin “/” inicial (todos los nombres son absolutos).
Ejemplo: this.getClass().getClassLoader().getResourceAsStream("some/pkg/resource.properties");
Class.getResourceAsStream()
Formato: nombres separados por “/”; “/” inicial indica nombres absolutos; todos los demás nombres son relativos al paquete de la clase
Ejemplo: this.getClass().getResourceAsStream("/some/pkg/resource.properties");
Actualizado en septiembre de 2020: enlace del artículo modificado. El artículo original era de Javaworld, ahora está alojado en InfoWorld (y tiene muchos más anuncios)