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/
それでも同じエラーが発生します。
使用するとき
this.getClass().getResource("myFile.ext")
getResource
は、パッケージに関連するリソースを見つけようとします。使用する場合:
this.getClass().getResource("/myFile.ext")
getResource
はそれを絶対パスとして扱い、完了した場合と同じようにクラスローダーを呼び出します。
this.getClass().getClassLoader().getResource("myFile.ext")
ClassLoader
パスで先頭の/
を使用できないのは、すべてのClassLoader
パスが絶対パスであり、/
がパスの最初の有効な文字ではないためです。
トゥル、
.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
getResource("/install.xml");
である必要があります
リソース名は、getClass()クラスが存在する場所に関連しています。テストがorg/example/foo/MyTest.class
の場合、getResource("install.xml")
はorg/example/foo/install.xml
を検索します。
install.xml
がsrc/test/resources
にある場合、クラスパスのルートにあるため、リソース名の前に/
を追加する必要があります。
また、たまにしか機能しない場合は、Eclipseが出力ディレクトリ(例:target/test-classes
)をクリーンアップし、ランタイムクラスパスにリソースが欠落していることが原因である可能性があります。パッケージエクスプローラーの代わりにEclipseのナビゲータービューを使用していることを確認します。ファイルが見つからない場合は、mvn package
目標を実行します。
次の条件でも同じ問題が発生しました。
src/test/Java
)内のJavaソースファイルと同じパッケージにあります。NullPointerException
を使用したテストでビルドが失敗しました。test-classes
フォルダーにコピーされず、ビルドの失敗が説明されました。NullPointerException
も取得されました。Testのリソースフォルダーにリソースファイルを配置することで、これを修正しました:src/test/resources
ソースクラスと同じパッケージ構造を使用します。
ところで私はgetClass().getResource(...)
を使用しました
Eclipseがテストケースを実行すると、src/test/resourcesではなくtarget/classesでファイルが検索されます。リソースが保存されると、Eclipseはsrc/test/resourcesからtarget/classesにリソースが変更された場合にコピーしますが、何らかの理由でこれが発生しなかった場合、このエラーが発生します。ファイルがターゲット/クラスに存在することを確認して、これが問題であるかどうかを確認します。
私はあなたと同じ問題に遭遇したと思います。シンプルな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にコピーできると思います。
Mavenを使用したプロジェクトで同じ問題が発生しました。ここでどのように修正したか:ソース(画像、音楽、その他のもの)をリソースディレクトリに置くだけです:
src/main/resources
Resourcesディレクトリ内のパッケージにも同じ構造を作成しました。例えば:
クラスがオンの場合
com.package1.main
Resourcesディレクトリに、同じ名前のパッケージを1つ入れます
com.package1.main
だから私は使用します
getClass().getResource("resource.png");
それを見てもう一つのことは私のためにそれを解決しました:
Eclipse/Mavenプロジェクトでは、Javaクラスがsrc/test/Java
にあり、その中でthis.getClass().getResource("someFile.ext");
パターンを使用して、リソースファイルが同じパッケージにあるsrc/test/resources
のリソースを探していましたテストクラスがテストソースフォルダー内にあったため、リソースソースフォルダー内の場所。それらを見つけることができませんでした。
src/test/resources
ソースフォルダー、ビルドパスを右クリックし、[包含/除外フィルターの構成]を選択します。 **/*.ext
の新しい包含フィルターを追加して、ファイルがスクラブされないようにしました。テストでリソースファイルを見つけることができます。