LoginSignup
5
2

GradleでオリジナルのSourceSetを利用してハマった話

Last updated at Posted at 2024-03-16

はじめに

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
build.gradle (sourceSetsの一部を抜粋)
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 プロパティを直接上書きするように修正しました。

build.gradle (修正後のsourceSetsの一部を抜粋)
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'
            ]
        }
    }
}
5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2