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

时间:2014-08-20 12:48:33

标签: spring classpath

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

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

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
....

我该怎么做?我必须动态加载jar,我不提前知道资源名称。

2 个答案:

答案 0 :(得分:32)

在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());
}

答案 1 :(得分:9)

正如Tech Trip在评论中提到的那样,我的模式中出现了错误。 Spring-documentation也很清楚(请参阅警告):“classpath *:”与Ant样式模式结合使用时,只能在模式开始之前与至少一个根目录可靠地工作...来自JDK的ClassLoader.getResources()

中的限制

所以我将模式改为

classpath*/model/*.myextension

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