我正在尝试加载具有特定文件扩展名的所有资源,这些资源在运行时使用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,我不提前知道资源名称。
答案 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创建的,因此我必须强制执行必须使用模型文件夹的约定。