2012-08-17 11 views
11

aplicación My Java necesita ser capaz de encontrar un directorio myconfig/ que será incluido dentro de la misma JAR:¿Cómo leer un directorio desde el classpath en tiempo de ejecución?

myjar.jar/ 
    com/ 
     me/ 
      myproject/ 
       ConfigLoader.java --> looks for myconfig/ directory and its contents 
    myconfig/ 
     conf-1.xml 
     conf.properties 
     ... etc. 

¿Cómo que seguir para leer este directorio myconfig/ fuera de la ruta de clases de tiempo de ejecución? He hecho algunas investigaciones y parece que el método normal de lectura de un archivode la ruta de clases no funciona para directorios:

InputStream stream = ConfigLoader.class.getResourceAsStream("myconfig"); 

Así que ¿alguien sabe cómo leer un directorio completo de la runtime classpath (a diferencia de un solo archivo)? ¡Gracias por adelantado!

Tenga en cuenta: No es posible cargar los archivos individualmente, myconfig es un directorio con miles de archivos de propiedades dentro de él.

+0

¿Qué estás tratando de hacer? –

+0

Estoy tratando de simplificar el problema para poder explicarlo. Hay una biblioteca llamada 'langdetect' alojada en google [aquí] (http://code.google.com/p/language-detection/). La biblioteca se envía con un directorio 'profiles' que utiliza para cargar cada archivo de propiedades de un solo idioma en el classpath de tiempo de ejecución. En tiempo de ejecución necesita llamar a un método 'DetectFactory.loadProfile (String)' para inicializar el directorio 'profiles /'. Entonces este directorio debe estar en el classpath. Puedo hacer que esto funcione cuando le paso una ruta de archivo abs, pero al final necesito empaquetar esto dentro del mismo JAR. – IAmYourFaja

+0

Así que, en última instancia, solo necesito pasar 'DetectFactory.loadProfiles' a String que lo apunta al directorio' profiles' dentro del mismo JAR. Así que mientras mi ejemplo muestra el directorio 'myconfig', realmente es' profiles'. Donde muestra 'ConfigLoader', es realmente' DetectFactory'. – IAmYourFaja

Respuesta

10

Puede usar el PathMatchingResourcePatternResolver provisto por Spring.

public class SpringResourceLoader { 

    public static void main(String[] args) throws IOException { 
     PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); 

     // Ant-style path matching 
     Resource[] resources = resolver.getResources("/myconfig/**"); 

     for (Resource resource : resources) { 
      InputStream is = resource.getInputStream(); 
      ... 
     } 
    } 
} 

yo no hice nada de fantasía con la Resource devuelto pero se obtiene la imagen.

Agregar a su dependencia Maven (si se utiliza Maven):

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-core</artifactId> 
    <version>3.1.2.RELEASE</version> 
</dependency> 
4

Se podría llamar ClassLoader.getResource() para encontrar un determinado archivo en el directorio (o el propio directorio, si getResource() volverá directorios). getResource() devuelve una URL que apunta al resultado. A continuación, puede convertir esta URL en cualquier forma que requiera la otra biblioteca.

+0

El método 'getResource()' de hecho devuelve directorios. – jaco0646

Cuestiones relacionadas