我正在阅读有关classpath *的spring文档,结果发现:
请注意,classpath *:与Ant样式的模式结合使用时,除非模式文件实际存在于目标文件中,否则在模式启动之前,它只能与至少一个根目录可靠地一起工作。这意味着类似classpath *:*。xml的模式将不会从jar文件的根目录检索文件,而只会从扩展目录的根目录检索文件。这源于JDK的ClassLoader.getResources()方法的限制,该方法仅返回传入的空字符串的文件系统位置(指示可能要搜索的根)。
当我在本地尝试时,我很困惑它可以在jar的根目录下工作,例如:
test.txt资源存在于test2根目录(这是我从中运行应用程序的类),并且test上也有test.txt,它依赖于test2
项目test2:
@RunWith(JUnit4.class)
public class TestDriver {
@Test
public void test() throws IOException {
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
System.out.println(Arrays.toString(resolver.getResources("classpath*:*test.txt")));
Enumeration<URL> enumeration= this.getClass().getClassLoader().getResources("");
int count=0;
while(enumeration.hasMoreElements()){
URL url= enumeration.nextElement();
System.out.println(url.getFile());
count++;
}
System.out.println(count);
}
}
输出:
[URL [jar:file:/ C:/.../。m2 / repository / com / test / 1.0-SNAPSHOT / test-1.0-SNAPSHOT.jar!/test.txt]]--> < strong>根据文档,该文本文件位于jar根上时如何检测的问题
从“ this.getClass()。getClassLoader()。getResources(“”)”开始,只有2个根(测试jar不属于其中):
/..../ test2 / target / test-classes /
/..../ test2 / target / classes /
2
答案 0 :(得分:1)
在这种特定情况下,文档指的是资源查找的可靠性。
您还可以阅读PathMatchingResourcePatternResolver
javadoc的警告部分(强调是我的):
警告:请注意,与Ant样式的模式结合使用时,“ classpath *:” 只能在至少一个根目录之前可靠地工作 模式开始
...
此
ResourcePatternResolver
实现旨在减轻 通过URLClassLoader内省和jar根查找限制 “ java.class.path”清单评估;但是,没有便携性 保证。
看来它适合您的情况。