2011-07-18 6 views
28

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

クラスパス内のすべてのプロパティファイルをロードすることもできます。

答えて

24

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

残念ながら、「ディレクトリ」内にないリソースについては既知の問題があります。例えば。 foo/bar.txtは問題ありませんが、bar.txtに問題があります。これはdescribed well in the Spring Referenceですが、決してSpring固有の問題ではありません。

更新:

はここで、入力ストリームのリストを返すヘルパーメソッドです:

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

クール。ありがとう! InputStreamを取得するためにそのURLを処理する方法の例を追加してください。 – Zeemee

+1

@Mulmoth: 'URL'クラスには、そのURLのInputStreamを返す' openStream'メソッドがあります。それはあなたが必要とするものでなければなりません。 –

+1

@Mulmothは私の更新を参照してください –

0

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

を開き、[プロパティを探してそのエントリを列挙したいファイル

のjava.util.zip.ZipFile

を使用してファイル。

エントリを取得すると、そのストリームを得ることができます.getInputStream()

+1

いいアイデアですが、私は通常、コード内のjarファイルの場所と名前を知りません。 – Zeemee

+2

@Mulmothはい:System.getProperty( "java.class.path") –

+0

@Sean Patrick Floyd:すべてのJARファイルがSystemクラスパス上にあるわけではありません。たとえば、Webアプリケーションでは、それらはあらゆる場所から来ています。 – Thilo

関連する問題