44

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.

2 Answers 2

41

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); 
Sign up to request clarification or add additional context in comments.

3 Comments

Cool. Thanks! Could you please add an example how to proceed with that URLs to get an InputStream?
@Mulmoth: The URL class has an openStream method that returns an InputStream for that URL. That should be all you need.
Works fine. You just saved my day
0

jar files are zip files.

Open the file using java.util.zip.ZipFile

Then enumerate its entries looking for the properties file you want.

When you have the entry you can get its stream with .getInputStream()

4 Comments

Nice idea, but I normally do not know the location and name of the jar files in code.
@Mulmoth yes you do: System.getProperty("java.class.path")
@Sean Patrick Floyd: Not all JAR files are on the System class path. For example in Web applications, they come from all sorts of places.
@Thilo that's of course true, still, I wanted to make him aware of the method for standard situations

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.