web-dev-qa-db-ja.com

異なるJARから同じ名前の複数のリソースファイルを読み取る方法は?

クラスパスに2つのJARファイルがあり、どちらもルートに「config.properties」という名前のリソースが含まれている場合。 getClass().getResourceAsStream()に似た両方ファイルを取得する方法はありますか?順序は関係ありません。

別の方法は、可能であれば、特定の基準に一致するクラスパス内のすべてのプロパティファイルをロードすることです。

35
Zeemee

必要です ClassLoader.getResources(name)
(または静的バージョン ClassLoader.getSystemResources(name) )。

ただし、残念ながら、「ディレクトリ」内にないリソースには既知の問題があります。例えば。 foo/bar.txtは問題ありませんが、bar.txt問題になる可能性があります。これは Springリファレンスで詳しく説明されています ですが、Spring固有の問題ではありません。

更新:

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

使用法:

List<InputStream> resources = loadResources("config.properties", classLoader);
// or:
List<InputStream> resources = loadResources("config.properties", null);
30

jarファイルはZipファイルです。

Java.util.Zip.ZipFileを使用してファイルを開きます

次に、エントリを列挙して、必要なプロパティファイルを探します。

エントリがある場合は、.getInputStream()を使用してそのストリームを取得できます。

0
mbarnes