0

別のモジュールのリソースを使用してファイルをインポートしようとしています。私の目標は、各カスタム クラスでファイル名を渡し、別のモジュールの基本クラスにファイルを取得させることです。

しかし、常に Nullpointer Exception が発生します。私は何を間違っていますか?

モジュール A:

src/main/java/foo/bar/MyBaseClass.java
src/main/resources/foo/bar/test.xml

モジュール B:

src/main/java/other/path/MyCustomClass extends MyBaseClass

クラス:

abstract class MyBaseClass {
    public static String TESTFILE = "foo/bar/test.xml";
    getData(String filename) {
        InputStream inputStream = MyBaseClass.class.getResourceAsStream(String filename); //NPE
    }
}

class MyCustomClass extends MyBaseClass() {
    doSomething() {
        getData(TESTFILE);
    }
}

/編集: このようなものを使用する必要がありますか?

super.getClass().getResourceAsStream(..)
4

2 に答える 2

1

ClassLoader.getResourceAsStream()を使用する必要がある可能性が非常に高いです

例えば

Thread.currentThread().getContextClassLoader().getResourceAsStream()  

(おそらくより安全で、さまざまな環境でより正しく動作する可能性があります。つまり、特別なクラスローダーが使用されている場合、Java EE?)

または少なくとも

aClass.getClassLoader().getResourceAsStream()

これは、getResourceXXX を呼び出している特定のクラスとは異なる JAR (またはクラスパス エントリ) にある可能性のあるクラスパスにリソースをロードする方法です。

モジュール B にあるクラスを使用していて、モジュール A からリソースをロードする場合は、ClassLoader.getResourceXXX を使用する必要があります。

そのため、Java では、通常、このアプローチを使用する必要があります (リソースの読み込みをより小さな領域に制限することに関心がない限り...)。

注意すべきもう1つのこと:先頭の「/」の必要性に注意し、使用しているメソッドのjavadocを常に再確認してください

参照: http://www.xyzws.com/servletfaq/what-is-different-between-classloadergetresourceasstream-and-classgetresourceasstream/21

于 2012-05-31T02:42:27.970 に答える
0

getResourcesAsStream()は、リソース名であるため、ファイル名ではない名前を想定しています。さらに、他の Maven モジュールからリソースにアクセスしようとしているようです。また、相対パスを介してリソースにアクセスしようとしていることを忘れないでください。これは、 foo/bar/test.xmlではなく/foo/bar/test.xmlのような絶対リソース パスに変更する必要があります。

于 2012-05-30T17:37:17.473 に答える