spring - framework - Búsqueda de recursos con PathMatchingResourcePatternResolver y URLClassloader en JARs
spring mvc (2)
Cargar los archivos dinámicamente en Spring es simple, cambiaría el enfoque para encontrar los archivos con extensiones.
Intenta lo siguiente:
ClassLoader cl = this.getClass().getClassLoader();
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(cl);
Resource[] resources = resolver.getResources("classpath*:/*.xml") ;
for (Resource resource: resources){
logger.info(resource.getFilename());
}
Estoy intentando cargar todos los recursos con una extensión de archivo específica que se cargan dinámicamente en tiempo de ejecución utilizando un URLClassloader.
Desafortunadamente, PathMatchingResourcePatternResolver no devuelve Recursos cuando uso el patrón classpath*:/*.myextension
. Cuando especifico un archivo con su nombre completo como classpath*:/test.myextension
el recurso se carga, por lo que creo que el Classloader está configurado correctamente.
URLClassloader classloader = new URLClassloader(jarURLs); // jarURLs look like "file:C:/Temp/test.jar"
Thread.getCurrentThread().setContextClassloader(classloader)
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(classloader);
Resource[] resources = resolver.getResources("classpath*:/*.myextension") // yields empty array
....
¿Cómo puedo hacer esto? Tengo que cargar los frascos dinámicamente y no sé los nombres de los recursos de antemano.
Como mencionó Tech Trip en el comentario a su respuesta, tuve un error en mi patrón. La Spring-documentation también es clara al respecto (ver Advertencia): "classpath *:" cuando se combina con patrones de estilo Ant solo funcionará de manera confiable con al menos un directorio raíz antes de que comience el patrón ... se origina en una limitación en el ClassLoader.getResources de JDK ()
Así que cambié mi patrón a
classpath*/model/*.myextension
Dado que los archivos JAR se crean a partir de un xText-DSL, tengo que imponer una convención de que se debe usar la carpeta modelo.