Saltar al contenido

getResourceAsStream devuelve null

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:

  1. 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)
  2. use una ruta absoluta: la ruta comienza en la raíz del JAR
  3. 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

  1. ClassLoader.getResourceAsStream().

Formato: nombres separados por “/”; sin “/” inicial (todos los nombres son absolutos).

Ejemplo: this.getClass().getClassLoader().getResourceAsStream("some/pkg/resource.properties");

  1. 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)

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *