Spring 5.1.2 PathMatchingResourcePatternResolver在jar的根目录上检测文件

时间:2018-11-11 18:27:19

标签: java spring classpath classloader

我正在阅读有关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

1 个答案:

答案 0 :(得分:1)

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

  

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

     

...

     

ResourcePatternResolver实现旨在减轻   通过URLClassLoader内省和jar根查找限制   “ java.class.path”清单评估;但是,没有便携性   保证。

看来它适合您的情况。