Reputation: 56894
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.
Upvotes: 11
Views: 13590
Reputation: 567
String path = getClass().getClassLoader().getResource("myproperties.properties").getPath();
Upvotes: -2
Reputation: 151
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");
Upvotes: 0
Reputation: 48045
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>
Upvotes: 12
Reputation: 25380
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.
Upvotes: 5