使用JAR中的PathMatchingResourcePatternResolver和URLClassloader查找资源

los*_*and 29 spring classpath

我试图加载具有特定文件扩展名的所有资源,这些资源在运行时使用URLClassloader动态加载.

不幸的是,当我使用模式时,PathMatchingResourcePatternResolver不返回任何资源classpath*:/*.myextension.当我指定一个文件的完整名称,如classpath*:/test.myextension资源加载,所以我认为类加载器配置正确.

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
....
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?我必须动态加载jar,我不提前知道资源名称.

Tec*_*rip 33

在Spring中动态加载文件很简单,我会改变查找带扩展名的文件的方法.

请尝试以下方法:

ClassLoader cl = this.getClass().getClassLoader(); 
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(cl);
Resource[] resources = resolver.getResources("classpath*:/*.xml") ;
for (Resource resource: resources){
    logger.info(resource.getFilename());
}
Run Code Online (Sandbox Code Playgroud)


los*_*and 10

正如Tech Trip在评论中提到的那样,我的模式中出现了错误.在Spring的文档也安静明确有关(见警告)"的classpath*:"在与Ant风格的图案相结合,将仅模式开始前可靠地与至少一个根目录下工作......从限制起源JDK的ClassLoader.getResources()

所以我改变了我的模式

classpath*/model/*.myextension
Run Code Online (Sandbox Code Playgroud)

由于JAR是从xText-DSL创建的,因此我必须强制执行必须使用模型文件夹的约定.