Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to read several resource files with the same name from different JARs?

Tags:

java

classpath

If there are two JAR files in the classpath, both containing a resource named "config.properties" in its root. Is there a way to retrieve both files similar to getClass().getResourceAsStream()? The order is not relevant.

An alternative would be to load every property file in the class path that match certain criterias, if this is possible at all.

like image 729
Zeemee Avatar asked Jul 18 '11 08:07

Zeemee


People also ask

How do I view the Resources folder in a jar file?

This works when running inside and outside of a Jar file. PathMatchingResourcePatternResolver r = new PathMatchingResourcePatternResolver(); Resource[] resources = r. getResources("/myfolder/*"); Then you can access the data using getInputStream and the filename from getFilename .

Does jar file contain resources?

jar ) contain your executable classes and resource files. A jar can also contain other jar files, which is useful when your program needs some library which is packaged in a jar.


1 Answers

You need ClassLoader.getResources(name)
(or the static version ClassLoader.getSystemResources(name)).

But unfortunately there's a known issue with resources that are not inside a "directory". E.g. foo/bar.txt is fine, but bar.txt can be a problem. This is described well in the Spring Reference, although it is by no means a Spring-specific problem.

Update:

Here's a helper method that returns a list of InputStreams:

public static List<InputStream> loadResources(         final String name, final ClassLoader classLoader) throws IOException {     final List<InputStream> list = new ArrayList<InputStream>();     final Enumeration<URL> systemResources =              (classLoader == null ? ClassLoader.getSystemClassLoader() : classLoader)             .getResources(name);     while (systemResources.hasMoreElements()) {         list.add(systemResources.nextElement().openStream());     }     return list; } 

Usage:

List<InputStream> resources = loadResources("config.properties", classLoader); // or: List<InputStream> resources = loadResources("config.properties", null); 
like image 145
Sean Patrick Floyd Avatar answered Nov 06 '22 19:11

Sean Patrick Floyd