2010-04-14 16 views
9

Tengo un archivo jar con recursos (principalmente configuración para cachés, registros, etc.) que deseo distribuir.Acceder a los recursos de JAR

Estoy teniendo un problema con las rutas relativas de esos recursos, así que hice lo que he encontrado en otra pregunta StackOverflow, que dijo que esta era una forma válida:

ClassInTheSamePackageOfTheResource.class.getResourceAsStream('resource.xml'); 

Lamentablemente esto hace no trabajo.

¿Alguna idea? ¡Gracias!

PD: Obviamente no puedo usar absolutos caminos, y me gustaría evitar variables de entorno si es posible

+0

¿Está el archivo de recursos en la misma carpeta que el archivo de clase? ¿Es esta una aplicación independiente o ejecutándose en un servidor web? – kgiannakakis

+0

De hecho, está en la misma carpeta. Es un contenedor destinado a ser incluido en una aplicación web, sí (pero creo que debería ser irrelevante) –

+2

Es relevante que las reglas para buscar recursos asociados con una clase dada sean implementadas por el cargador de clases de definición. Por lo tanto, el cargador de clases de su aplicación web podría comportarse de forma ligeramente diferente en función de la implementación. Solo un pensamiento. –

Respuesta

11

Asegúrese de que su carpeta de recursos aparece como una carpeta fuente en la configuración de su proyecto. Además, asegúrese de que la carpeta de recursos esté configurada para exportar cuando construya su jar.

Puede agregar una extensión .zip a su archivo jar y abrirla para asegurarse de que sus recursos estén incluidos y en la ubicación esperada.

siempre uso rutas absolutas como esto:

InputStream input = this.getClass().getResourceAsStream("/image.gif"); 

Al utilizar rutas absolutas, "/" es la carpeta raíz en el archivo JAR, no la carpeta raíz de la máquina host.

+4

+1 para el nota sobre/ser la carpeta raíz del jar. – Powerlord

+0

De hecho, utilicé el método de ruta absoluta (jar) que describió y ¡funcionó! No sé por qué no funcionó el truco con el relativo ... pero lo suficientemente bueno es lo suficientemente bueno –

1

siempre tengo que descifrar a través getResourceAsStream para hacer este trabajo. Si "resource.xml" está en org/pablo/opus, yo creo desea que esta:

Name.class.getResourceAsStream("org.pablo.opus.resource.xml"); 
1

donde el resource.xml encontró? Si está en la raíz del árbol fuente, intente prefijar con /.

+0

No está en la raíz del árbol fuente. Está dentro de un paquete –

+1

así que trate el nombre completo como una ruta absoluta, por ejemplo com.me.and.u.effects.css se accederá como /com/me/and/u/effects.css – Seffi

1

por lo general almacenar archivos y otros recursos y luego recuperarlos como URL:

URL url = MyClass.class.getResource("/design/someResource.png"); 

Dentro de un contexto estático, o de otro modo:

URL url = getClass().getResource("/design/someResource.png"); 

de una instancia.

Los fragmentos anteriores suponen que el diseño es una carpeta de nivel superior dentro del contenedor. En general, si la ruta comienza con una "/", asume una ruta absoluta, de lo contrario es relativa desde la ubicación de la clase.

Cuestiones relacionadas