开发者

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

开发者 https://www.devze.com 2023-03-20 20:05 出处:网络
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 t开发者_开发知识库o getClass().getResourc

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 t开发者_开发知识库o 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.


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);


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()

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号