build.gradleの位置とサブプロジェクトの関係

こんにちは。 エキサイト株式会社の三浦です。

今回は、Javaで用いられる依存・タスク管理ファイルである build.gradle の位置が、サブプロジェクトと関連しているということについて説明していきます。

build.gradleは分けて使える

Java、特にSpring Bootを使っている人であれば、 build.gradle ファイルは馴染み深いものかもしれません。

この build.gradle ファイルですが、実は分割して使用することができます。

まずは、プロジェクトをサブプロジェクトとして分割します。

Gradle では setting.gradleというファイルでサブプロジェクトを作成することができます。

include ':sample1'
include ':sample2'

続いて、以下のようなパッケージ構造を作ります。

.
├── sample1
│   └── build.gradle
├── sample2
│   └── build.gradle
├── setting.gradle
└── build.gradle

build.gradle ファイルは以下のようにしてみます。

ルートプロジェクトのbuild.gradle

subprojects {
    dependencies {
        implementation 'org.springframework.boot:spring-boot-starter'
    }
}

sample1サブプロジェクトのbuild.gradle

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

sample2サブプロジェクトのbuild.gradle

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-security'
}

このようにすることで、

  • ルートプロジェクトの build.gradle により、すべてのサブプロジェクトに spring-boot-starter がインストールされる
  • sample1の build.gradle により、 sample1 サブプロジェクトにのみ spring-boot-starter-web がインストールされる
  • sample2の build.gradle により、 sample2 サブプロジェクトにのみ spring-boot-starter-security がインストールされる

とすることが可能です。

ここで注意するべき点は、ルートプロジェクトでは subprojects を指定した後に dependencies ブロックを作っていましたが、各サブプロジェクトでは直接 dependencies ブロックから始まっている点です。

サブプロジェクトのパッケージに位置した時点で、その build.gradle ファイルは暗黙的に「そのサブプロジェクトがルートプロジェクトであるかのように挙動する」ようになります。

そのことを念頭に置いて適切な依存解決等を行ってください。

最後に

今回は、 build.gradle が配置される位置により、自動的に該当するサブプロジェクトの設定として使用されるという説明をしました。

単に分割できるというだけではないので、「設定したはずなのに使えない」となってしまわないよう、適切な配置・設定をするようにしましょう。