私はモジュールを備えた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
を開こうとします
それに対処する方法はありますか?
コードを保持したい場合は、実行/デバッグ構成の作業ディレクトリを変更してみてください(コンボボックスの最初のエントリで実行したいものにアクセスできます)これをモジュールルートに設定します。しかし、他の提案されたアプローチを好む:
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");
Guillaumeに触発されたソリューション:
Run->Edit configuration->Defaults->JUnit->Working directory
値を設定$MODULE_DIR$
とIntellijは、Mavenと同様にすべてのJunitで相対パスを設定します。
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())
プロジェクトファイル(.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に置き換えられます