2017-11-19 4 views
2

私はマルチモジュールプロジェクトを持っています。私はIntelliJを使用しており、テストリソースディレクトリとしてsrc/test/resourcesをマークしています。私はそのディレクトリにabc.txtを配置しました。テストファイルを読み込むのは、ClassLoaderを使用している場合のみです。

最初の行は私のために実行されますが、2番目の行は実行されませんが、他の行はなぜ機能するのですか?

// this returns a stream 
this.getClass().getClassLoader().getResourceAsStream("abc.txt")); 
// this returns null 
this.getClass().getResourceAsStream("abc.txt")); 

Googleでテストファイルを読み込むための最初の数回のヒットを読んだ後、これらの提案が見つかりました。私は二番目がいくつかの人々のために働くことを可能にする細部が何であるか私ではないことを私は知らない。

いくつかのコーナーケースでClassLoaderが動作しないというヒントがいくつか見つかりました。私がジェンキンスにそれをプッシュするとすぐにこれが失敗するのだろうか?

+0

このクラスを呼び出す場所のコードと、上記のコードの実行方法を教えてください。また、クラスローダーは 'this.getClass()。getRes..'を行う際に解決しなければならないことは、あなたのケースでは私が考えていることです。 – nullpointer

+0

そのクラスの最初のテスト。テストメソッドには2行しかありません。私はいつもこのような問題に悩まされているので、まずこの問題に直面しました。 – MedicineMan

+0

'this.getClass()。getResourceAsStream("/abc.txt ")'を試してみましたか? –

答えて

1

すべてのクラスには、クラスのロード用に定義されたClassLoaderがあります。

this.getClass().getResourceAsStream("abc.txt")); 

オブジェクトがブートストラップクラスローダによってロードされた場合は、ClassLoader.getSystemResourceAsStream(java.lang.String)にメソッドを委譲し、検索を使用する:唯一の違いは問題になっている状況ではClass.getResourceAsStreamのようにしていることがありますリソースを検索するクラスをロードするために使用されるパス。クラスローダのいずれか、絶対リソース名がこのアルゴリズムを用いる方法Class.getResourceAsStream内の指定されたリソース名から構成された委任前

  • 名が「/」で始まる場合( '\ u002f')、リソースの絶対名は '/'の後の名前の部分です。
  • そうでない場合、絶対名は次の形式のものである: modified_pa​​ckage_name /名前modified_pa​​ckage_nameは、「/」の代わりにこのオブジェクトのパッケージ名で

    「」 ( '\ u002e')。

あなたのケースでは、後者が真実になり、リソースを見つけることができません。

関連する問題