Gradle Projects の基本を Spring Boot で学ぶ
はじめに
Gradleは、ライブラリの依存関係の管理、ビルドプロセスの定義、タスク実行などをしてくれるツールです。
TypeScript に慣れている自分からすると、npm と tsconfig に類似するものだと理解しています。
とはいえ、npm と tsconfig に比べてできることも幅広く、各種概念は下図のように、それぞれに関連付いているように思えるため、個人的には分かりにくく感じました。
公式ドキュメントを読んでいくうちに、Projects, Tasks, Plugins, Dependency Management をそれぞれ別々に深堀って学んでいくと理解しやすいと感じました。
(公式ドキュメントではそのような切り口ではなく、各概念を行ったり来たりするように思えて複雑に感じました。)
上と同様の図は公式にもあります。
まずは、最上位概念の Projects から始め、その次に Plugins の実体となる Tasks を理解し、配布可能な共有物となる Task である Plugins を理解し、依存性管理の Dependency Management を理解して Gradle の概要を掴んでいきます。
本稿は Projects が対象です。
主に settings.gradle および build.gradle の概要を掴むのが趣旨になります。
[注]
筆者は Java に精通しているわけでも SpringBoot に精通しているわけでもありません。
現在進行形で学習しており、その内容の理解のためにブログにまとめています。
なお、IDEはVSCodeです。
Projects とは
Projectは、アプリケーションやライブラリなどビルド対象となるソフトウェアの単位を表します。
1つのプロジェクトしか持たないものと、複数プロジェクトを持つもので大きく分かれます。
さらに複数プロジェクトを持つアプローチは、すべてのサブプロジェクトに等しくロジック共有される Multi-Project Builds (buildSrc) と、各サブプロジェクト間のロジック共有、部分的に独立させるロジック共有のケースで利用される Composite Builds (build-logic) の2つがあります。
本稿は基本を扱う趣旨なので、buildSrc アプローチに限定して進めます。
まずは SpringBootプロジェクトをGradleで作成して中身を確認します。
SpringBootプロジェクトをGradleで開始する
VSCode + SpringBoot(Gradle)でWebアプリの開発環境を構築する などを参考にプロジェクトを作成します。
こんな感じの構成で出力されます。
.
└── demo
├── HELP.md
├── build
├── build.gradle(.kts)
├── gradle
├── gradlew
├── gradlew.bat
├── settings.gradle(.kts)
└── src
setting.gradle を眺めます。
プロジェクト名は demo
です。
// settings.gradle
rootProject.name = 'demo'
次に、 build.gradle を眺めます。
build.gradle は対応するプロジェクトのビルドを構成し、 setting.gradle が生成したプロジェクトに紐付けるものです。
(現状1プロジェクトしかないのですが、マルチプロジェクトとなった際、各build.gradle はそれぞれのプロジェクトを構成し、 setting.gradle が生成したマルチプロジェクトに紐付けます。)
ひとまず、 group, version, java 以外の項目は本稿ではスルーです。
それぞれ、グループ名、バージョン、(自動的に)指定されるJavaバージョンが分かります。
// build.gradle
plugins {
id 'java'
id 'org.springframework.boot' version '3.4.2'
id 'io.spring.dependency-management' version '1.1.7'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
tasks.named('test') {
useJUnitPlatform()
}
マルチプロジェクトにしてみる
Composite Builds ではなく Multi-Project Builds を利用します。
こちらは、なんとなく使わないGradle という素晴らしいブログのハンズオンで対応されているので割愛します。
とはいえ、これでは他の方のブログ紹介しているだけなので、Projects に関わる主要な箇所だけを説明します。
1 buildSrc に build.gradle を配置する
Multi-Project Builds で利用される buildSrc とは以下のような特徴を持ちます。
- Gradle が自動的に認識して、コンパイルされ、クラスパスが登録される特別なディレクトリ
- ビルドスクリプト間の共通 TasksやPluginなどを実行するための仕組み
- プロジェクト内でカスタマイズされたビルドロジックを格納する標準的な方法
要するに、プロジェクト全体にビルドロジックを共有するための特別な場所です。
(あえて参照したブログのまま掲載しています。)
// ktsを使って設定を書いていくので、kotlin-dslプラグインを利用する
// ktsでない場合は、groovy-gradle-plugin
plugins {
`kotlin-dsl`
}
repositories {
mavenCentral()
}
// Spring Bootのバージョンはここで指定する
// Spring Boot 用の Gradle Plugin
dependencies {
implementation("org.springframework.boot:spring-boot-gradle-plugin:2.7.6")
}
Tasks や Plugins を理解した上で利用する必要があるため、ひとまずこれくらいで進めます。
2 サブプロジェクトを作成
サブプロジェクト直下に build.gradle を配置します。
(直下に配置しなくてもサブプロジェクトと認識させることは可能ですが、推奨はされていないようです。)
.
├── settings.gradle
├── build.gradle
├── api/
│ └── build.gradle
└── domain/
└── project/build.gradle
└── todo/build.gradle
3 サブプロジェクトを登録
settings.gradle にサブプロジェクトを追記します。
rootProject.name = "gradle-sample"
include("api", ":domain:todo", ":domain:project")
4 各プロジェクトの依存性を追加
各 build.gradle に dependency を追加します。
(dependencyについては別で深堀りします)
// domain/project/build.gradle(.kts)
dependencies {
implementation(project(":domain:todo"))
}
// api/build.gradle(.kts)
dependencies {
implementation(project(":domain:project"))
implementation(project(":domain:todo"))
}
以上、シングルプロジェクトからマルチプロジェクトにすることで、 Projects の基本概念を理解しました。
次は、Tasks の基本を学びます。
Discussion