はじめに
Gradleを用いたJavaプロジェクトで、デフォルトの規約に沿わないディレクトリ構成をとるときは sourceSets
の設定を変更して実現します。
そのようなオリジナルのディレクトリ構成をとったことで発生した問題の解決記録です。
参考:【Gradle】規約と異なる構成のJavaプロジェクトをビルドする
結論
srcDir
メソッドでディレクトリを指定した場合は追記となり、デフォルトの設定 (src/[ソースセット名]/java
など) は残ったままとなります。
デフォルトの設定が残っていると困る場合は srcDirs
プロパティを直接上書きしましょう。
やったこと
以下のような構成のプロジェクトで、結合テストを実行するCIの修正をしていました。
<project-root>
├ subdir1/src
| ├ main (メインのソースコード)
| ├ test (単体テストのテストコード)
| └ int-test (結合テストのテストコード)
├ subdir2/src
| ├ main
| ├ test
| └ int-test
└ subdir3/src
├ main
├ test
└ int-test
sourceSets {
main {
java {
srcDir 'subdir1/src/main/java'
srcDir 'subdir2/src/main/java'
srcDir 'subdir3/src/main/java'
}
}
test { // 単体テスト
java {
srcDir 'subdir1/src/test/java'
srcDir 'subdir2/src/test/java'
srcDir 'subdir3/src/test/java'
}
}
integrationTest { // 結合テスト
java {
srcDir 'subdir1/src/int-test/java'
srcDir 'subdir2/src/int-test/java'
srcDir 'subdir3/src/int-test/java'
}
}
}
Gradleタスクに結合テストのソースを読ませようと、タスクの設定に sourceSets.integrationTest
を追記する修正をしたところ、 <project-root>/src/integrationTest/java
というディレクトリがないと怒られてしまいました。
調査
どうなっとるんじゃと srcDirs
の中身を全て出力させた結果が以下。
<project-root>/src/integrationTest/java
<project-root>/subdir1/src/int-test/java
<project-root>/subdir2/src/int-test/java
<project-root>/subdir3/src/int-test/java
先頭のやつは何?と思ってドキュメントを調べたところ、この正体はデフォルトで srcDirs
プロパティに設定される src/${sourceSet.name}/${sourceDirectorySet.name}
でした。
srcDir
メソッドの説明を読むと、 "Adds the given source directory to this set." とのことなので、デフォルトの設定は残したうえでオリジナルのディレクトリを追加している状態になってしまっていたのでした。
修正
srcDirs
プロパティに存在しないディレクトリが残ってしまっていたので、追記のメソッドである srcDir
を使うのではなく srcDirs
プロパティを直接上書きするように修正しました。
sourceSets {
main {
java {
srcDirs = [
'subdir1/src/main/java',
'subdir2/src/main/java',
'subdir3/src/main/java'
]
}
}
test {
java {
srcDirs = [
'subdir1/src/test/java',
'subdir2/src/test/java',
'subdir3/src/test/java'
]
}
}
integrationTest {
java {
srcDirs = [
'subdir1/src/int-test/java',
'subdir2/src/int-test/java',
'subdir3/src/int-test/java'
]
}
}
}