Estoy cargando un archivo de texto desde dentro de un paquete en un JAR compilado de mi proyecto Java. La estructura de directorios relevante es la siguiente:
/src/initialization/Lifepaths.txt
El código que se utiliza para cargar el archivo es:
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 imprimirá null
, no importa lo que yo uso. No estoy seguro de por qué lo anterior no funcionaría, así que también he probado:
"/src/inicialización/Lifepaths.txt"
"initialization/Lifepaths.txt"
"Rutas de vida.txt"
Ninguno de estos funciona. He leído numerosas preguntas hasta ahora sobre el tema, pero ninguna de ellas ha sido útil - generalmente, sólo dicen que se carguen los archivos usando la ruta raíz, lo cual ya estoy haciendo. Eso, o simplemente cargar el archivo desde el directorio actual (sólo cargar nombredelarchivo
), que también he probado. El archivo está siendo compilado en el JAR en la ubicación apropiada con el nombre apropiado.
¿Cómo puedo resolver esto?
Lifepaths.class.getClass().getResourceAsStream(...)
carga recursos usando el cargador de clases del sistema, obviamente falla porque no ve tus JARs
Lifepaths.class.getResourceAsStream(...)
carga recursos utilizando el mismo cargador de clases que cargó la clase Lifepaths y debería tener acceso a los recursos de tus JARs
Las reglas son las siguientes:
E inténtalo:
Lifepaths.class.getResourceAsStream("/initialization/Lifepaths.txt")
en lugar de
Lifepaths.class.getClass().getResourceAsStream("/initialization/Lifepaths.txt")
(no estoy seguro de si hay alguna diferencia, pero el primero utilizará el ClassLoader/ JAR correcto, mientras que no estoy seguro con el segundo)
Así que hay varias maneras de obtener un recurso de un tarro y cada uno tiene una sintaxis ligeramente diferente donde la ruta debe ser especificada de manera diferente.
La mejor explicación que he visto es este artículo de JavaWorld. Lo resumiré aquí, pero si quieres saber más deberías consultar el artículo.
Métodos
ClassLoader.getResourceAsStream()
. Formato: "/" nombres separados; sin "/" inicial (todos los nombres son absolutos).
Ejemplo: this.getClass().getClassLoader().getResourceAsStream("some/pkg/resource.properties");
.
Class.getResourceAsStream()
Formato: "/"nombres separados; el "/" inicial indica nombres absolutos; todos los demás nombres son relativos al paquete de la clase'.
Ejemplo: this.getClass().getResourceAsStream("/some/pkg/resource.properties");