无法从在Maven项目标准目录资源和春天PathMatchingResourcePatternRes

2019-10-19 22:07发布

注:按照下面的接受的解决方案,这似乎只是realated的事实,Spring的DefaultResourceLoader不使用类加载器来创建资源URL的情况下,这样的自定义类加载器被忽略

https://jira.spring.io/browse/SPR-8176

我有一个标准的Maven项目,它看起来是这样的

$ tree
.
├── pom.xml
└── src
    ├── main
    │   ├── java
    │   │   
    │   └── resources
    │       └── application.properties
    └── test
        └── java

我将有更多的资源文件不久将在资源目录下的目录树,我想遍历他们。 继其他几个职位,我现在用的是PathMatchingResourcePatternResolver Spring框架。 我已经写抓住所有文件名的功能如下

public static List<File> getAllResourceFiles() {
    PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
    Resource[] resources;
    try {
        resources = resolver.getResources("classpath*:.*");
        System.out.println(JsonUtils.objectToJson(resources));
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

其中objectToJson是简单地使用杰克逊序列化对象的功能。 现在,当我编译和运行这个应用程序,我没有得到任何结果。 特别是,我没有看到application.properties。 如何使这项工作?

$ java -jar target/MyApp.one-jar.jar
[]

更新:由于在下面的评论指出,这是使用西蒙凝灰岩一个罐子Maven插件。 然而,从classpath作品读取文件的常用方式。 亦即

MyClass.class.getResourceAsStream("/application.properties");

更新2:我试过如下:

resources = resolver.getResources("classpath:**/*.*");

而得到这个堆栈跟踪

java.io.FileNotFoundException: class path resource [] cannot be resolved to URL because it does not exist
at org.springframework.core.io.ClassPathResource.getURL(ClassPathResource.java:178)
at org.springframework.core.io.support.PathMatchingResourcePatternResolver.isJarResource(PathMatchingResourcePatternResolver.java:414)
at org.springframework.core.io.support.PathMatchingResourcePatternResolver.findPathMatchingResources(PathMatchingResourcePatternResolver.java:343)
at org.springframework.core.io.support.PathMatchingResourcePatternResolver.getResources(PathMatchingResourcePatternResolver.java:282)
at com.example.utils.ResourceUtils.getAllResourceFiles(ResourceUtils.java:29)
at com.example.Starter.main(Starter.java:14)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.simontuffs.onejar.Boot.run(Boot.java:340)
at com.simontuffs.onejar.Boot.main(Boot.java:166)

在Starter.java的代码

public static void main(String[] args) { 
    System.out.println(Environment.getProperty("com.example.applicationLogPath"));
    System.out.println(JsonUtils.objectToJson(ResourceUtils.getAllResourceFiles()));
}

第一行成功执行,并打印applicationLogPath属性的字符串值。 第二使FNF堆栈跟踪。 获取属性的代码使用获得的输入流中的jar文件的标准方法。

Environment.class.getResourceAsStream("/application.properties");

Answer 1:

我认为这个问题是OneJar。 你的项目运行得很好,如果它是“一个罐子”罐子之外使用,我测试过它(后我评论这是打破JsonUtils部分),我可以看到它的扫描文件。 它似乎别人都打这个或类似的问题 ,也是如此。 另外,我不太肯定春季(通过JIRA问题)将被改变,这样的资源将被载入取悦OneJar。



Answer 2:

我想你要找的是

resources = resolver.getResources("classpath:**/*.*");
                                        // ^ don't need the * here

它与任何扩展任何嵌套级别的所有资源相匹配。

你有什么

resources = resolver.getResources("classpath*:.*");

在一个没有名字,但任何延长的classpath的根目录匹配的资源。



文章来源: Unable to get file list from standard resource dir in Maven project with Spring PathMatchingResourcePatternResolver