5

次のプロジェクト構造のようなものがあります

-project 
    -src/main/java // source folder
        -com.mypackage
            -Utility.java
            -some.properties
    -src/main/resources // source folder
        -configuration_files
            -configuration_report.txt

私はjarEclipseのExport関数で生成しています。上記はjar、次の構造の に変換されます。

-myjar.jar
    -com
        -mypackage
            -Utility.class
            -some.properties
    -configuration_files
        -configuration_report.txt

クラス内で、 fromUtilityを取得しようとしています。InputStreamconfiguration_report.txt

私はこれを行っていました(staticメソッド内にあります):

Utility.class.getResourceAsStream("/configuration_files/configuration_report.txt"); 

ファイルはそれを要求するクラスと同じパッケージにないため、これはこの質問への回答によって検証されるようです。

ただし、実行すると、が返されますnull。なんで?

some.propertiesファイルについては、両方を実行できることに注意してください

Utility.class.getResourceAsStream("/com/package/some.properties");
Utility.class.getResourceAsStream("some.properties");

そして私はストリームを取得します。

違いがある場合は、コマンドラインからこれを実行しています。

java [-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=1044] -cp myjar.jar MyMain

Eclipse内で実行しようとすると、動作します...

編集:

このコードは関連しています。前の の有無にかかわらず、/null を返します

    String sourceFilePath = "/configuration_files" + File.separator + "configuration_report.txt";
    InputStream in = Utility.class.getResourceAsStream(sourceFilePath);
4

1 に答える 1

9

何度も試行した後、解決策は次の小さな javadoc エントリに行き着きClassLoader#getResource(String)ます。

リソースの名前は、リソースを識別する「/」で区切られたパス名です。

私が最初に投稿したスニペットは機能していたでしょう

Utility.class.getResourceAsStream("/configuration_files/configuration_report.txt"); 

を使用していませんでしたが、編集で次のように/使用していました。File.separator

String sourceFilePath = "/configuration_files" + File.separator + "configuration_report.txt";

クラスローダーがOS固有のファイル操作のように機能すると考えていました。最初/は一致しましたが、私は Windows を使用しているため、 にFile.separator評価されました。\\

のjavadocClass#getResource(String)は、同じことをもっと言います。

modified_pa​​ckage_name は、「.」を「/」に置き換えたこのオブジェクトのパッケージ名です。('\u002e')。

これがコマンドラインからではなくEclipseで機能した理由については、まだわかりませんが、以下の@andyのコメントを見てください。

この記事は、この状況の適切な説明です。

于 2013-05-01T16:17:50.380 に答える