getResourceAsStream devuelve nulo
Estoy cargando un archivo de texto desde un paquete en un JAR compilado de mi proyecto Java. La estructura de directorio relevante es la siguiente:
/src/initialization/Lifepaths.txt
Mi código carga un archivo llamando Class::getResourceAsStream
para devolver un archivo InputStream
.
public class Lifepaths {
public static void execute() {
System.out.println(Lifepaths.class.getClass().
getResourceAsStream("/initialization/Lifepaths.txt"));
}
private Lifepaths() {}
//This is temporary; will eventually be called from outside
public static void main(String[] args) {execute();}
}
La impresión siempre se imprimirá null
, sin importar lo que use. No estoy seguro de por qué lo anterior no funcionaría, así que también intenté:
"/src/initialization/Lifepaths.txt"
"initialization/Lifepaths.txt"
"Lifepaths.txt"
Ninguno de estos funciona. He leído numerosas preguntas hasta ahora sobre el tema, pero ninguna ha sido útil; por lo general, solo dicen que cargue archivos usando la ruta raíz, lo cual ya estoy haciendo. Eso, o simplemente cargar el archivo desde el directorio actual (simplemente cargar filename
), lo cual también probé. El archivo se está compilando en el JAR en la ubicación adecuada con el nombre adecuado.
¿Cómo puedo solucionar esto?
Lifepaths.class.getClass().getResourceAsStream(...)
carga recursos usando el cargador de clases del sistema, obviamente falla porque no ve sus archivos 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
Al invocar getResourceAsStream(nombre), el nombre debe comenzar con "/". No estoy seguro de si esto es necesario, pero tengo un problema sin él.
Las reglas son las siguientes:
- verifique la ubicación del archivo que desea cargar dentro del JAR (y así 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 lugar de
Lifepaths.class.getClass().getResourceAsStream("/initialization/Lifepaths.txt")
(No estoy seguro si hace una diferencia, pero el primero usará el ClassLoader/JAR correcto, mientras que no estoy seguro con el segundo)