【发布时间】:2019-04-14 13:33:12
【问题描述】:
我正在阅读有关 classpath* 的 spring 文档,我发现:
请注意,classpath*: 与 Ant 风格的模式结合使用时,只能在模式开始前至少在一个根目录下可靠地工作,除非实际的目标文件驻留在文件系统中。这意味着像 classpath*:*.xml 这样的模式不会从 jar 文件的根目录中检索文件,而只会从扩展目录的根目录中检索文件。这源于 JDK 的 ClassLoader.getResources() 方法的限制,该方法仅返回传入空字符串的文件系统位置(指示要搜索的潜在根)。
当我在本地尝试这个时,我很困惑它在 jar 的根目录下工作,例如:
test.txt 资源存在于 test2 根目录(这是我运行应用程序的类),并且 test.txt 上也存在依赖于 test2 的 test.txt
项目测试2:
@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]] --- > 这个文本文件如何在 jar 的根目录中检测到的问题,根据文档,它不应该被检测到
从 "this.getClass().getClassLoader().getResources("")" 只有 2 个根(测试 jar 不是其中的一部分):
/..../test2/target/test-classes/
/..../test2/target/classes/
2
【问题讨论】:
-
@davidxxx aaah 你问错了。我在询问 jar 上的文件是如何检测到它的。因为根据 spring doc files on root 将不会被检测到“不会从 jar 文件的根目录中检索文件,而只会从扩展目录的根目录中检索文件”
-
我删除了我的 cmets,好像不再有用了。
标签: java spring classpath classloader