【问题标题】:Spring 5.1.2 PathMatchingResourcePatternResolver detects files on root of jarSpring 5.1.2 PathMatchingResourcePatternResolver 检测 jar 根目录下的文件
【发布时间】: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


【解决方案1】:

该文档指的是在这种特定情况下资源查找的可靠性。
您还可以阅读PathMatchingResourcePatternResolver javadoc(重点是我的)的此警告部分的末尾:

警告:请注意,“classpath*:”与 Ant 样式模式结合使用时 只能在至少一个根目录下可靠地工作 模式开始

...

这个ResourcePatternResolver 实现试图减轻 jar root 查找限制 通过 URLClassLoader 自省和 “java.class.path”清单评估;但是,没有便携性 保证。

它似乎适用于你的情况。

【讨论】:

  • aaah 所以至少没有保证,非常好的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多