Antes que nada, he leído muchos S.O. preguntas sobre este tema y he intentado las cosas sugeridas en ellos.¿Cómo deben accederse los recursos en un contenedor compilado?
Aquí está mi situación. Estoy escribiendo una aplicación Java utilizando el marco de procesamiento y estoy en las etapas finales en las que necesito comenzar a pensar en empaquetar la aplicación. Un archivo jar que es ejecutable desde la línea de comandos es lo que estoy intentando construir usando la función Exportar en Eclipse.
La estructura de mi proyecto tiene el siguiente aspecto:
src/
multiple packages/
libs/
jar files and natives
data/
fonts and images
config/
json files
Cuando exporto el archivo jar y uzip el frasco para inspeccionar su contenido, me parece que el contenido de estos directorios se han vertido en el nivel superior del .jar.
que se parece a esto:
.jar
packages
jar files
fonts
json files
lo tanto, cuando intento cargar un archivo de configuración con algo como:
BufferedReader reader = new BufferedReader(new FileReader(path));
todo funciona solo archivo cuando corro la aplicación en Eclipse. Pero el archivo jar arroja un FileNotFoundException
.
Muchas de las preguntas que he visto en S.O. con respecto a problemas como estos, recomienda usar class.getClass().getResource()
o class.getResourceAsStream()
. He probado ambos utilizando rutas relativas y el nombre del fichero como en:
class.getResource('config.json');
class.getResources('cfg/config.json');
class.getResourceAsStream('../../config.json');
Todos estos métodos devuelven NULL, cuando se ejecuta desde cualquiera de Eclipse o el frasco usando:
java -jar myjarfile.jar
soy también abierto para usar un archivo Ant. De hecho, ahora estoy usando el archivo Ant generado por la función de exportación para construir el contenedor. Si hay algo que puedo agregar a eso para agregar los directorios en el contenedor también sería genial.
Gracias por su respuesta. ¿Sugiere que use la barra diagonal en una adición a getResource()? – JeremyFromEarth
Esto parece acercarse mucho más. Esta es la ruta que esto devuelve: jar: file:/C: /path_to_project/myjarfile.jar! /config.json Sin embargo, cuando ejecuto el jar aún obtengo un archivo no de excepción aunque la ruta sea correcta. También debería mencionar que funciona desde dentro de Eclipse. – JeremyFromEarth
No puede usar FileReaders con recursos dentro de jar. Debe usar el InputStream devuelto por getResourceAsSTream. –