2009-12-14 18 views
19

Tengo un proyecto A, que contiene algunos archivos java y un recurso classpath R.txt. Dentro del proyecto utilizo ClassLoader.getSystemResource ("R.txt"); para recuperar R.txt.Recurso Classpath dentro del jar

Luego tengo un proyecto B que incluye el archivo jar del proyecto A. Ahora getSystemResource ("R.txt") no encontrará el archivo de texto (y sí, todavía está en la raíz del archivo jar). Incluso intentar "/R.txt" como se sugirió en otro sitio no funcionó. ¿Algunas ideas?

Respuesta

42

Use getResource en lugar de getSystemResource para usar un recurso específico para un cargador de clases determinado en lugar del sistema. Por ejemplo, trate de cualquiera de los siguientes:

URL resource = getClass().getClassLoader().getResource("R.txt"); 
URL resource = Foo.class.getClassLoader().getResource("R.txt"); 
URL resource = getClass().getResource("/R.txt"); 
URL resource = Foo.class.getResource("/R.txt"); 

Nota de la barra inicial al llamar Class.getResource en lugar de ClassLoader.getResource; Class.getResource es relativo al paquete que contiene la clase a menos que tenga una barra diagonal, mientras que ClassLoader.getResource es siempre absoluta.

+0

Increíble. Esto resolvió completamente mi problema. Gracias por la entrada superrápida // Johan –

+0

Una pregunta más relacionada: podemos obtener InputStream de estos recursos de URL, pero ¿cómo podríamos crear un objeto ** Archivo ** desde el objeto de URL devuelto. Intenté crear un objeto ** URI ** con el "URLObject.toURI()" y utilizar este objeto URI para crear un archivo. Desafortunadamente, arroja un "URI no es una excepción jerárquica". ¿Podrías darme algo de ayuda? Muchas gracias . –

+2

@EnsomHodder: Um, no estoy seguro, pero no todos los recursos * son * archivos, en particular, no lo será si está en un archivo jar. –

5

Aparentemente su JAR no está cargado por el cargador de clases del sistema, por lo que getSystemResource() no puede funcionar. Esto debería funcionar:

ClassFromProjectA.class.getClassLoader().getResource("R.txt") 

OMI más conveniente es poner los recursos dentro del mismo paquete que las clases que las utilizan, por lo que puede utilizar el más corto

ClassFromProjectA.class.getResource("R.txt") 

(o, dentro de esa clase sólo getClass().getResource("R.txt"))

2

¿Funciona ClassLoader.getResource()? Por el momento, simplemente está especificando que se debe usar el cargador de clases del sistema.

+0

Funciona como un amuleto. Solo tuve que usar el cargador de clases correcto :) –

Cuestiones relacionadas