1

私はmavenを使用してsrc/main/resources おり、ローカルシステムのフォルダー内からファイルをロードしようとすると呼び出されるソースフォルダーにテキストファイルがあります。

BufferedReader reader = new BufferedReader(new InputStreamReader(this.getClass().getResourceAsStream("/stopwords_german.txt")));

しかし、プロジェクトをEclipseでRunnable Jarとしてエクスポートし、サーバーでjarを開始するとすぐに、Nullpointer例外が発生します

Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:622)
    at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.lang.NullPointerException
    at java.io.Reader.<init>(Reader.java:78)
    at java.io.InputStreamReader.<init>(InputStreamReader.java:72)
    at de.test.dataminer.helper.FilterText.initStopwords(FilterText.java:43)

BufferedReader のある行です。

ここで非常によく似た質問を見ましたが、何もうまくいかなかったので、修正するためにテストしました(classloader を試すなど)。誰でもポインターですか?

    <resources>
      <resource>
        <directory>/home/johnny/workspace/dataminer/src/main/resources</directory>
      </resource>
    </resources>
4

1 に答える 1

0

A チェック: jar (zip 形式) を 7zip 程度で開くだけです。ファイル名は大文字と小文字を区別する必要があります (Windows では大文字と小文字が区別されません)。これは、IDE の外部で jar を実行してテストすることもできます。

注意: エンコーディングを InputStreamReader に追加します。そうしないと、現在のオペレーティング システムのエンコーディングが使用されます - 移植性がありません。

BufferedReader reader = new BufferedReader(
        new InputStreamReader(
            this.getClass().getResourceAsStream("/stopwords_german.txt"),
            "Cp1252"));

すべてが適合する場合でも、何か問題が発生する可能getClass()性があります。(おそらく継承によって) jar の外部のクラスである可能性があります。次に、のようなことをするか、前にスラッシュなしでSomeClassInJar.class.getResource使用します。ClassLoader.getResourceAsStrean("stopwords_german.txt")

于 2014-05-11T21:37:52.220 に答える