2012-07-15 13 views
7

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.

Respuesta

5

Para llegar a los recursos en la raíz, anteponga un / a la ruta. Si no, lo hace en relación con el paquete actual, que generalmente solo es útil si el recurso está físicamente cerca de la clase en sus fuentes también.

Así que use class.getResourceAsStream("/config.json"); para llegar a config.json en la raíz del contenedor.

También tenga en cuenta que las jarras internas no son compatibles.

+0

Gracias por su respuesta. ¿Sugiere que use la barra diagonal en una adición a getResource()? – JeremyFromEarth

+0

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

+1

No puede usar FileReaders con recursos dentro de jar. Debe usar el InputStream devuelto por getResourceAsSTream. –

1

Su archivo .jar solo debe incluir los directorios relacionados con el "paquete" para el código compilado. Puede estar haciendo referencia a una estructura .war con/lib/WEB-INF, etc. y esto es diferente.

Si su estructura de paquetes es:

com.yourco.authentication 

Y su clase en la sesión

A continuación, el frasco debe ser

/com/ 
    /yourco/ 
    /authentication/ 
     Login.class 

este caso es necesario el .jar en la ruta de clases para el env para ejecutar a través de la línea de comando.

Veo que se nota que funciona en Eclipse, que probablemente tiene la configuración del entorno y las librerías necesarias importadas, etc., tan difícil de decir exactamente. Si su paquete/carpeta incluye el código java compilado, no estoy seguro si eso funcionará cuando se haga referencia externamente, lo que sugiere que inicie sus paquetes en la carpeta raíz.

+0

Veo otra sugerencia con la edición de su código para referenciar /. sin pruebas, podría funcionar, pero parece que está intentando empaquetar una aplicación y no una lib con la estructura de su directorio. –

Cuestiones relacionadas