web-dev-qa-db-ja.com

this.getClass()。getClassLoader()。getResource( "...")およびNullPointerException

Eclipse heliosの単一の子モジュールで最小のMavenプロジェクトを作成しました。

Src/test/resourcesフォルダーに、単一ファイル「install.xml」を配置しました。 src/test/Javaフォルダーに、以下を実行する単一のクラスを持つ単一のパッケージを作成しました。

  @Test
  public void doit() throws Exception {
    URL url = this.getClass().getClassLoader().getResource("install.xml");
    System.out.println(url.getPath());

  }

しかし、junit 4単体テストとしてコードを実行すると、NullPointerExceptionが発生します。これは何百万回も前にうまく機能しました。何か案は?

私はこのガイドに従っています:

http://www.fuyun.org/2009/11/how-to-read-input-files-in-maven-junit/

それでも同じエラーが発生します。

55
u123

使用するとき

this.getClass().getResource("myFile.ext")

getResourceは、パッケージに関連するリソースを見つけようとします。使用する場合:

this.getClass().getResource("/myFile.ext")

getResourceはそれを絶対パスとして扱い、完了した場合と同じようにクラスローダーを呼び出します。

this.getClass().getClassLoader().getResource("myFile.ext")

ClassLoaderパスで先頭の/を使用できないのは、すべてのClassLoaderパスが絶対パスであり、/がパスの最初の有効な文字ではないためです。

91
AmishDave

トゥル、

  • .getClass().getResource(fileName)を使用すると、fileNameの場所は呼び出し元クラスの場所と同じであると見なされます。
  • .getClass().getClassLoader().getResource(fileName)を使用する場合、fileNameの場所はルート、つまりbinフォルダーであると見なされます。

ソース:

package Sound;
public class ResourceTest {
    public static void main(String[] args) {
        String fileName = "Kalimba.mp3";
        System.out.println(fileName);
        System.out.println(new ResourceTest().getClass().getResource(fileName));
        System.out.println(new ResourceTest().getClass().getClassLoader().getResource(fileName));
    }
}

出力:

Kalimba.mp3
file:/C:/Users/User/Workspaces/MyEclipse%208.5/JMplayer/bin/Sound/Kalimba.mp3
file:/C:/Users/User/Workspaces/MyEclipse%208.5/JMplayer/bin/Kalimba.mp3
36
namalfernandolk

getResource("/install.xml");である必要があります

リソース名は、getClass()クラスが存在する場所に関連しています。テストがorg/example/foo/MyTest.classの場合、getResource("install.xml")org/example/foo/install.xmlを検索します。

install.xmlsrc/test/resourcesにある場合、クラスパスのルートにあるため、リソース名の前に/を追加する必要があります。

また、たまにしか機能しない場合は、Eclipseが出力ディレクトリ(例:target/test-classes)をクリーンアップし、ランタイムクラスパスにリソースが欠落していることが原因である可能性があります。パッケージエクスプローラーの代わりにEclipseのナビゲータービューを使用していることを確認します。ファイルが見つからない場合は、mvn package目標を実行します。

19
mhaller

次の条件でも同じ問題が発生しました。

  • リソースファイルは、Javaソースフォルダー(src/test/Java)内のJavaソースファイルと同じパッケージにあります。
  • コマンドラインでmavenを使用してプロジェクトをビルドすると、NullPointerExceptionを使用したテストでビルドが失敗しました。
  • コマンドラインビルドでは、リソースファイルがtest-classesフォルダーにコピーされず、ビルドの失敗が説明されました。
  • コマンドラインのビルド後にEclipseに移動し、Eclipseでテストを再実行すると、EclipseでNullPointerExceptionも取得されました。
  • プロジェクトをクリーンアップ(ターゲットフォルダーのコンテンツを削除)し、Eclipseでプロジェクトを再ビルドすると、テストは正しく実行されました。これは、クリーンなプロジェクトで開始したときに実行される理由を説明しています。

Testのリソースフォルダーにリソースファイルを配置することで、これを修正しました:src/test/resourcesソースクラスと同じパッケージ構造を使用します。

ところで私はgetClass().getResource(...)を使用しました

5

Eclipseがテストケースを実行すると、src/test/resourcesではなくtarget/classesでファイルが検索されます。リソースが保存されると、Eclipseはsrc/test/resourcesからtarget/classesにリソースが変更された場合にコピーしますが、何らかの理由でこれが発生しなかった場合、このエラーが発生します。ファイルがターゲット/クラスに存在することを確認して、これが問題であるかどうかを確認します。

5
oenpelli

私はあなたと同じ問題に遭遇したと思います。シンプルなmvnプロジェクトを作成し、「mvn Eclipse:eclipse」を使用してEclipseプロジェクトをセットアップしました。

たとえば、ソースファイル「Router.Java」は「Java/main/org/jhoh/mvc」にあります。そして、Router.Javaは、「Java/main/org/jhoh/mvc/resources」にある「routes」ファイルを読みたい

Eclipseで「Router.Java」を実行すると、EclipseのコンソールにNullPointerExeptionが追加されました。この設定でpom.xmlを設定し、すべての* .class Javaバイトコードファイルをビルドディレクトリに配置します。

<build>
    <defaultGoal>package</defaultGoal>
    <directory>${basedir}/build</directory>
<build>

「build/classes/org/jhoh/mvc/resources」ディレクトリに移動しましたが、「ルート」はありません。 Eclipse DID NOT「ルート」を「build/classes/org/jhoh/mvc/resources」にコピーします

「install.xml」をソースコードディレクトリの* .classバイトコードディレクトリ、NOTにコピーできると思います。

1
Le Wang

Mavenを使用したプロジェクトで同じ問題が発生しました。ここでどのように修正したか:ソース(画像、音楽、その他のもの)をリソースディレクトリに置くだけです:

src/main/resources

Resourcesディレクトリ内のパッケージにも同じ構造を作成しました。例えば:

クラスがオンの場合

com.package1.main

Resourcesディレクトリに、同じ名前のパッケージを1つ入れます

com.package1.main

だから私は使用します

getClass().getResource("resource.png");
0
user1462820

それを見てもう一つのことは私のためにそれを解決しました:

Eclipse/Mavenプロジェクトでは、Javaクラスがsrc/test/Javaにあり、その中でthis.getClass().getResource("someFile.ext");パターンを使用して、リソースファイルが同じパッケージにあるsrc/test/resourcesのリソースを探していましたテストクラスがテストソースフォルダー内にあったため、リソースソースフォルダー内の場所。それらを見つけることができませんでした。

src/test/resourcesソースフォルダー、ビルドパスを右クリックし、[包含/除外フィルターの構成]を選択します。 **/*.extの新しい包含フィルターを追加して、ファイルがスクラブされないようにしました。テストでリソースファイルを見つけることができます。

0
Mikeb