注:按照下面的接受的解决方案,这似乎只是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");