2011-12-19 5 views
1

Java EEアプリケーションで、このコードをプロパティファイルを読み込むために使用しています。 Myservice.propertiesWEB-INF/classesフォルダの下に置かれていても、プロパティはLinux環境では読み込まれませんが、Windows環境で正常に動作しています。InputStreamReader getResourceAsStreamはLinuxで動作しますか?

InputStreamReader fMainProp = new InputStreamReader(this.getClass().getResourceAsStream("/Myservice.properties")); 

上記はWindowsでのみ有効ですか? getClass()で表されるように、あなたのコード内で呼び出し元のクラスをロードしたクラスローダが/WEB-INF/classesへのアクセス権を持っている場合、そのコードが動作するかどうか

MyWeb() { 
    prop = new Properties(); 
    try { 
     InputStreamReader fMainProp = new InputStreamReader(this.getClass().getResourceAsStream("/Myservice.properties")); 
     prop.load(fMainProp); 
    } catch (FileNotFoundException e1) { 
     e1.printStackTrace(); 
    } catch (IOException e1) { 
     e1.printStackTrace(); 
    } 
} 
+0

Linuxではどうなりますか? 'getResourceAsStream()'は 'null'を返しますか? –

答えて

4

が依存します。どうやら、問題のクラスはそれ自身では/WEB-INF/classesの内部にはないか、またはクラスパスのどこかに置かれたコピーを持ち、Linux環境で使用されるサーバのmake/versionは、Windows環境で使用されるサーバのmake/version 。

プロパティファイルが呼び出し側クラスと同じクラスローダーによってロードされることを保証できない場合は、呼び出し側クラスのクラスローダーによって取得するのではなく、コンテキスト現在のスレッドのクラスローダー。それはすべてにアクセスすることができます。

prop.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("Myservice.properties")); 

このクラスローダーでは、パスを相対パスにすることはできません。だから先導的なスラッシュから始めないでください。

+0

私はこれを理解しました。まだいくつかの混乱が続いています。これについてもう少し詳しく説明できますか?_もちろん、問題のクラスはそれ自身/ WEB-INF /クラスの中にはないか、クラスパスのどこかに置かれたコピーと、Linux環境で使用されるサーバのmake/version Windows環境で使用されるサーバーのメイク/バージョンとは多少異なるクラスローダー階層を使用します。 – Sriram

関連する問題