My Java application needs to be able to find a myconfig/ directory which will be bundled inside the same JAR:
myjar.jar/
com/
me/
myproject/
ConfigLoader.java --> looks for myconfig/ directory and its contents
myconfig/
conf-1.xml
conf.properties
... etc.
How do I actually go about reading this myconfig/ directory off the runtime classpath? I've done some research and it seems that the normal method of reading a file from the classpath doesn't work for directories:
InputStream stream = ConfigLoader.class.getResourceAsStream("myconfig");
So does anyone know how to read an entire directory from the runtime classpath (as opposed to a single file)? Thanks in advance!
Please note: It is not possible to load the files individually, myconfig is a directory with thousands of properties files inside it.
You can use the PathMatchingResourcePatternResolver provided by Spring.
public class SpringResourceLoader {
public static void main(String[] args) throws IOException {
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
// Ant-style path matching
Resource[] resources = resolver.getResources("/myconfig/**");
for (Resource resource : resources) {
InputStream is = resource.getInputStream();
...
}
}
}
I didn't do anything fancy with the returned Resource but you get the picture.
Add this to your maven dependency (if using maven):
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.1.2.RELEASE</version>
</dependency>
You could call ClassLoader.getResource() to find a particular file in the directory (or the directory itself, if getResource() will return directories). getResource() returns a URL pointing to the result. You could then convert this URL into whatever form the other library requires.
The trick seems to be that the class loader can find directories in the classpath, while the class can not.
So this works
this.getClass().getClassLoader().getResource("com/example/foo/myconfig");
while this does not
this.getClass().getResource("myconfig");
来源:https://stackoverflow.com/questions/12007012/how-to-read-a-directory-from-the-runtime-classpath