web-dev-qa-db-ja.com

MavenとIntellij間のJunitsでの相対パスを処理する方法

私はモジュールを備えたMavenプロジェクトを持っています

/myProject
pom.xml
    /myModule
    pom.xml
       /foo
       bar.txt

myModuleのJunitを考えてみましょう。これはbar.txtを開く必要があります。 basedirはモジュールディレクトリです。

ファイルを開くにはbar.txt

  new File("foo/bar.txt")

mvn test[〜#〜] but [〜#〜]を実行するとうまく機能しますintellijで同じjunitを起動すると、Intellijが設定するため失敗しますモジュールディレクトリではなく、プロジェクトディレクトリのbasedir。

IntellijはmyProject/foo/bar.txtではなくmyProject/myModule/foo/bar.txtを開こうとします

それに対処する方法はありますか?

44
tbruyelle

コードを保持したい場合は、実行/デバッグ構成の作業ディレクトリを変更してみてください(コンボボックスの最初のエントリで実行したいものにアクセスできます)これをモジュールルートに設定します。しかし、他の提案されたアプローチを好む:

ClassLoader.getSystemResourceAsStream(youPath) 

または私の好み:

getClass.getResource(youPath)

または

getClass.getResourceAsStream(youPath)

パスの先頭の「/」はプロジェクトの作業ディレクトリを示し、「/」は現在のクラスに対する相対ディレクトリを示しません。

この最後のソリューションをテストに使用します。テストデータリソースをテストソースと同じパッケージレベルに配置するか、乱雑なパッケージを避けるためにサブディレクトリに配置します。

このようにして、複雑なパスや作業ディレクトリを処理することなく、簡単な呼び出しを行うことができます。

project-root  
  - module A  
    - src  
      - test
        - rootfile.txt  
        - my-complicated-package-naming-root
          - mypackage
            - Test.Java
            - testResource.xml  

この方法でファイルを取得できます。

final URL rootfile= Test.class.getResource("/rootfile.txt");
final URL testResource= Test.class.getResource("testResource.xml");
25
Guillaume

Guillaumeに触発されたソリューション:

Run->Edit configuration->Defaults->JUnit->Working directory値を設定$MODULE_DIR$とIntellijは、Mavenと同様にすべてのJunitで相対パスを設定します。

84
tbruyelle

a)ファイルを使用せず、InputStreamsを使用します。経由でInputStreamを取得します

ClassLoader.getSystemResourceAsStream("foo/bar.xml")

ファイルを扱うほとんどのAPIもInputStreamsに満足しています。

b)fooディレクトリを使用せず、mavenとIDEの両方を知っているディレクトリを使用します(つまり、src/main/resourcesまたはsrc/test/resources、したがって、それらはクラスパスにあります)

c)FileではなくInputStreamを絶対に必要とするAPIを持っている場合、それでもできます

new File(ClassLoader.getSystemResource("foo/bar.xml").toURI())
12

[実行/デバッグ構成]ウィンドウでテストランナーの作業ディレクトリを指定できます。

enter image description here

2
Drew Noakes

プロジェクトファイル(.idea)をソースコードと同じディレクトリに置いておくと、@ tbruyelleからのソリューションが機能します。 Keep Project files in ...を別の場所に選択すると、$ MODULE_DIR $はワークスペースディレクトリを検索しようとし、パスが見つかりません。これはIntelliJのバグのように見えますが、すぐに修正されることを願っています。

回避策:作業ディレクトリでmavenモジュールの絶対/相対パスを指定できます

$MODULE_DIR$/../master/mavenmodule1

$MODULE_DIR$: points to workspace directory
../: relative path to source code
master: root directory of your source code
mavenmodule1: maven module name / directory name of the child module.

マルチモジュールのMavenプロジェクトの場合、選択肢はありません。そのモジュールを指す別の実行構成が必要です。 $ MAVEN_MODULE $($ MODULE_DIR $/../master/$ MAVEN_MODULE $)のみを指す別の変数があれば、すべてのモジュールにこの構成を使用できます。上記の例では、$ MAVEN_MODULE $はmavenmodule1に置き換えられます

0
Praveen