2009-04-14 14 views
15

Sé que podemos hacer algo como esto:¿Cómo ir a través de los recursos de la clase Java?

Class.class.getResourceAsStream("/com/youcompany/yourapp/module/someresource.conf") 

para leer los archivos que están empaquetados dentro de nuestro archivo jar.

Googled mucho y estoy seguro que no usando los términos apropiados; lo que quiero hacer es una lista de los recursos disponibles, algo como esto:

Class.class.listResources("/com/yourcompany/yourapp") 

que debe devolver una lista de recursos que están dentro del paquete com.yourcompany.yourapp.*

¿Es posible? ¿Alguna idea sobre cómo hacerlo en caso de que no se pueda hacer tan fácilmente como mostré?

Nota: Sé que es posible saber dónde está su frasco es y luego abrirlo e inspeccionar su contenido para lograrlo. Pero no puedo hacerlo en el entorno en el que estoy trabajando ahora.

+0

¿Algo como ServiceLoader es una opción? http://stackoverflow.com/questions/251336 Es decir, en lugar de enumerar un "directorio" en el classpath en tiempo de ejecución, proporciona una lista de recursos explícitamente en tiempo de compilación y la almacena en el classpath en una ubicación conocida . – erickson

Respuesta

9

Para recursos en un archivo JAR, algo como esto funciona:

URL url = MyClass.class.getResource("MyClass.class"); 
String scheme = url.getProtocol(); 
if (!"jar".equals(scheme)) 
    throw new IllegalArgumentException("Unsupported scheme: " + scheme); 
JarURLConnection con = (JarURLConnection) url.openConnection(); 
JarFile archive = con.getJarFile(); 
/* Search for the entries you care about. */ 
Enumeration<JarEntry> entries = archive.entries(); 
while (entries.hasMoreElements()) { 
    JarEntry entry = entries.nextElement(); 
    if (entry.getName().startsWith("com/y/app/")) { 
    ... 
    } 
} 

Usted puede hacer lo mismo con los recursos "explotado" en el sistema de archivos , o en muchos otros repositorios, pero no es tan fácil. Necesita un código específico para cada esquema de URL que quiera admitir.

+0

Gracias por el ejemplo , ¿utiliza el cargador de clases para llegar a los recursos? O actúa como un ayudante para abrir el archivo jar e inspeccionar sus contentes manualmente? –

+0

es una mezcla de ambos.Utiliza el cargador de clases para ubicar el recurso. Luego tienes que enumerar manualmente los contenidos. No lo mostré, pero una vez que tenga la lista de contenidos, puede volver al cargador de clases para cargarlo si lo desea, o cargarlo directamente desde el archivo usted mismo. – erickson

+0

Hmm, supongamos que está en la implementación appengine java vm. No te permitirá abrir el archivo. Ese fue más o menos el punto. Entonces, creo que esta es la respuesta correcta, pero lo que quería hacer no es posible. Puede tener implicaciones de seguridad implicaciones para no permitirlo :( Gracias erickson –

0

lo general el uso

getClass().getClassLoader().getResourceAsStream(...) 

pero dudo que puede enumerar las entradas de la ruta de clases, sin que lo sepa a priori.

+0

¿Puedes mostrar una referencia que señale lo que dices como un hecho? –

2

he estado buscando una manera de mostrar el contenido de un fichero JAR utilizando los cargadores de clases, pero por desgracia esto parece ser imposible. En cambio, lo que puede hacer es abrir el contenedor como un archivo comprimido y obtener el contenido de esta forma. Puede usar las formas estándar (here) para leer los contenidos de un archivo jar y luego usar el cargador de clases para leer los contenidos.

4

En general no se puede obtener una lista de los recursos de este tipo. Algunos cargadores de clases ni siquiera pueden ser capaces para soportar esto - imagine un cargador de clases que puede obtener archivos individuales de un servidor web, pero el servidor web no tiene que admitir la enumeración de los contenidos de un directorio. Para un archivo jar, puede cargar el contenido del archivo jar explícitamente, por supuesto.

(This question es similar, por cierto.)

+0

Será agradable para entender por qué los cargadores de clases no lo permiten o por qué el JRE no proporciona una manera fácil de hacerlo :( –

+0

@ David: Yo di un ejemplo de por qué no siempre es posible - la situación en la que el único el acceso que tienes en la tienda subyacente (la web) es "buscar este archivo". –

+0

Lo siento, ahora lo tengo. Era mi inglés malo y probablemente falta de atención. Ahora te entiendo. Gracias –

Cuestiones relacionadas