InputStreamReader getResourceAsStreamはLinuxで動作しますか?

私はこのコードをJava EEアプリケーションに持っていて、プロパティーファイルを読んでいます。 Myservice.properties WEB-INF/classes フォルダの下に置かれていますが、Linux環境ではプロパティは読み込まれませんが、Windows環境では正常に動作しています。

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

上記は窓でしか使えませんか?

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();
    }
}
1
Linuxではどうなりますか? getResourceAsStream() null を返しますか?
追加された 著者 Matt Ball,

1 答え

そのコードが機能するかどうかは、コード内の getClass()で表される呼び出しクラスをロードしたクラスローダーが/WEB-INF/classes にアクセスできるかどうかによって異なります。どうやら、問題のクラスはそれ自身では/WEB-INF/classes の内部にはないか、クラスパスのどこかに置かれたコピーを持ち、Linux環境で使用されるサーバmake/versionは若干異なるクラスローダWindows環境で使用されているサーバーのメイク/バージョンよりも高い階層になっています。

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

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

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

4
追加された
私はこれを理解した。まだいくつかの混乱が続いています。これについて少し詳しく説明できますか?明らかに問題のクラスは、それ自体が/ WEB-INF /クラス内にないか、クラスパス内の他の場所に置かれたコピーと、サーバのmake/versionがLinux環境では、Windows環境で使用されているサーバーのmake/versionとは多少異なるクラスローダー階層が使用されています。
追加された 著者 Sriram,