これがどのように可能かはわかりません。私はgetResourceAsStreamを読み直し、常にnullを返しています。
InputStream source = this.getClass().getResourceAsStream("test.xml");
Finderのtest.Javaのすぐ横(OS XとEclipseを使用)はtest.xmlです。
TextWranglerで開いて、内部にデータが存在するものとして表示できます。
これは、Junitテストで違いが生じる場合です。私はシステムにある既存のJunitテストを調べてみましたが、実際の例とまったく同じ方法で使用しています(ファイルの場所やコード自体など)。
GetClass()が正しいパスを返すことを防ぐのを妨げる小さな違いは何ですか?
ありがとう!
getResourceAsStream()
はCLASSPATHを使用しているため、ソースファイルではなくクラスの場所からロードされます。
XMLを.classファイルと同じディレクトリにコピーする必要があると思います。
クラスパスでリソースが見つかりません。 junitおよびmavenを使用している場合は、<include>
セクションに<testResource>
ファイルディレクティブを追加して、リソースがターゲット/テストクラスにコピーされていることを確認してください
また、次を使用して、ファイルシステム内のクラスの場所を見つけることもできます。
this.getClass().getResource(".")
リソースがそこにあるかどうかを確認する
Mavenを使用している場合は、この部分をpom.xml
<build>
<testResources>
<testResource>
<directory>${project.basedir}/src/test/resources</directory>
</testResource>
</testResources>
</build>
きみの test.xml
およびその他のリソースファイルは、src/test/resources
この方法には常に問題があります。ここに役立つ2つのリンクがあります。
私は常に、先頭に「/」または「./」を追加して実験します。
私の経験から、最良の方法はFileInputStreamを使用することです。 (EclipseでFileInputStreamを使用している間)覚えておかなければならないことは1つだけです。デフォルト設定では、作業ディレクトリはプロジェクトルートに設定されます。 このコード を使用して、現在のディレクトリの場所(および必要な相対パス)をいつでも確認できます。
test.xml
はtest
ルートソースフォルダーのすぐ下にあります。次のようにします。
InputStream source = this.getClass().getClassLoader().getResourceAsStream("test.xml");
私はこの問題に多くの時間を費やし、次の構成が不足していました。Eclipseプロジェクトを右クリックして、Properties-> Java Build Path-> Source = and edit Included row and add * .properties(* .fileExtension)
From Java API:
クラスをロードするために使用される検索パスから指定された名前のリソースを見つけます。このメソッドは、システムクラスローダーを介してリソースを検索します
したがって、たとえば、構文は次のようになります。ClassLoader.getSystemResource( "test.xml")。toString();
魔法のように機能します!
MyClass.getResourceAsStream()を試してください。
また、クラスパスにtest.xmlを入れてみてください。たとえば、Eclipse Webプロジェクトでは、text.xmlをwebcontent/WEB-INF/classesに配置します
Springクラスでこの問題が発生しました。 System.class.getResourceAsStream(...)
は単体テストでは機能しましたが、Tomcatでは機能しませんでした。Thread.currentThread().getContextClassLoader().getResourceAsStream(...)
はTomcatで機能しましたが、単体テストでは機能しませんでした。
最終的に私は一緒に行きました:
ClassUtils.getDefaultClassLoader()
.getResourceAsStream("com/example/mail/templates/invoice-past-due.html"))
また、このようにしてやると、notスラッシュで始まるパスが必要になりました。