Dev Study
← 解説「Gradle: build.gradle を1行ずつ読む」に戻る

サンプルコードで身につける: Gradle: build.gradle を1行ずつ読む

解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。

1build.gradle の全文(Groovy DSL)

が生成した 4.1.1 / Java 25 / 依存 web の雛形の です(28行)。強調した の3行が依存で、に版が書かれていません。ソースや出力の場所、コンパイルして にする手順もどこにも書かれていません。

build.gradle(start.spring.io 2026-10-03 取得。全文)設定ファイル
plugins {
id 'java'
id 'org.springframework.boot' version '4.1.1'
id 'io.spring.dependency-management' version '1.1.7'
}
 
group = 'com.example'
version = '0.0.1-SNAPSHOT'
 
java {
toolchain {
languageVersion = JavaLanguageVersion.of(25)
}
}
 
repositories {
mavenCentral()
}
 
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-webmvc'
testImplementation 'org.springframework.boot:spring-boot-starter-webmvc-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
 
tasks.named('test') {
useJUnitPlatform()
}

2同じものを Kotlin DSL で書いた build.gradle.kts

start.spring.io で type だけ gradle-project-kotlin にして取った です(同じ28行)。強調した行が 版と違う所です。 の書き方、id(...) version の括弧、文字列の引用符( と version の行も)と (...) の括弧、そして test を名前で選ぶ()か型で選ぶ(tasks.withType)かの違いです。両方を build すると、libs の2つの JAR はサイズが同じで、 のエントリ一覧は完全に一致しました。

build.gradle.kts(start.spring.io 2026-10-03 取得。全文)設定ファイル
plugins {
java
id("org.springframework.boot") version "4.1.1"
id("io.spring.dependency-management") version "1.1.7"
}
 
group = "com.example"
version = "0.0.1-SNAPSHOT"
 
java {
toolchain {
languageVersion = JavaLanguageVersion.of(25)
}
}
 
repositories {
mavenCentral()
}
 
dependencies {
implementation("org.springframework.boot:spring-boot-starter-webmvc")
testImplementation("org.springframework.boot:spring-boot-starter-webmvc-test")
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
}
 
tasks.withType<Test> {
useJUnitPlatform()
}

3settings.gradle と gradle-wrapper.properties

build.gradle に無いものが2つ、別のファイルにあります。プロジェクト名は の rootProject.name で、名 demo-0.0.1-SNAPSHOT.jar の demo はここから来ます(./gradlew でも name: demo と出ます)。gradlew が取ってくる の版は の distributionUrl で決まり、手元に要るのは だけです。Gradle 9.7.1 の手引きは、settings ファイルを「すべての Gradle プロジェクトの入口」(the entry point of every Gradle )とし、単一プロジェクトでは省略できる、としています。

settings.gradle(1行)と gradle/wrapper/gradle-wrapper.properties(9行)設定ファイル
# settings.gradle
rootProject.name = 'demo'
 
# gradle/wrapper/gradle-wrapper.properties
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-9.7.1-bin.zip
networkTimeout=10000
retries=0
retryBackOffMs=500
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
 
# Kotlin DSL 版は settings.gradle.kts に rootProject.name = "demo"(引用符が違うだけ)

4版を書いていないのに決まる: dependencies の木と、BOM を外したとき

./gradlew dependencies --configuration はに入る依存の木を出します。-> は、要求と違う版が選ばれたしるしです。強調した :1.3.5 -> 1.3.6 は Boot の が決めた版で、BOM の無い では 1.3.5 のままでした。一方、slf4j-api 2.0.17 -> 2.0.18 と jspecify 1.0.0 -> 1.0.1 は複数の要求がぶつかって新しい方が選ばれたもので、Ivy でも同じ版になります。(*) は既出の省略です。 は逆向きで、spring-core を誰が要求しているかを根元までたどります。plugins の の行を消して同じコマンドを打つと、版が決まらず FAILED になりました。

$ ./gradlew -q dependencies --configuration runtimeClasspath(先頭の抜粋)/ dependencyInsight / BOM のプラグインを消した版コマンド出力
runtimeClasspath - Runtime classpath of source set 'main'.
\--- org.springframework.boot:spring-boot-starter-webmvc -> 4.1.1
+--- org.springframework.boot:spring-boot-starter:4.1.1
| +--- org.springframework.boot:spring-boot-starter-logging:4.1.1
| | +--- ch.qos.logback:logback-classic:1.5.38
| | | +--- ch.qos.logback:logback-core:1.5.38
| | | \--- org.slf4j:slf4j-api:2.0.17 -> 2.0.18
| | +--- org.apache.logging.log4j:log4j-to-slf4j:2.25.5
| | | +--- org.apache.logging.log4j:log4j-api:2.25.5
| | | \--- org.slf4j:slf4j-api:2.0.17 -> 2.0.18
| | \--- org.slf4j:jul-to-slf4j:2.0.18
| | \--- org.slf4j:slf4j-api:2.0.18
| +--- org.springframework.boot:spring-boot-autoconfigure:4.1.1
| | \--- org.springframework.boot:spring-boot:4.1.1
| | +--- org.springframework:spring-core:7.0.9
| | | +--- commons-logging:commons-logging:1.3.5 -> 1.3.6
| | | \--- org.jspecify:jspecify:1.0.0 -> 1.0.1
| | \--- org.springframework:spring-context:7.0.9
| | +--- org.springframework:spring-aop:7.0.9
| | | +--- org.springframework:spring-beans:7.0.9
| | | | \--- org.springframework:spring-core:7.0.9 (*)
...
 
$ ./gradlew -q dependencyInsight --dependency spring-core --configuration runtimeClasspath
org.springframework:spring-core:7.0.9 (selected by rule)
...
org.springframework:spring-core:7.0.9
+--- org.springframework:spring-aop:7.0.9
| +--- org.springframework:spring-webmvc:7.0.9
| | \--- org.springframework.boot:spring-boot-webmvc:4.1.1
| | \--- org.springframework.boot:spring-boot-starter-webmvc:4.1.1
| | \--- runtimeClasspath (requested org.springframework.boot:spring-boot-starter-webmvc)
...
 
# build.gradle から id 'io.spring.dependency-management' の行を消して、同じコマンド
runtimeClasspath - Runtime classpath of source set 'main'.
\--- org.springframework.boot:spring-boot-starter-webmvc FAILED

5pom.xml との対応と、当たらない点

同じ Boot の雛形の (54行)と build.gradle(28行)で、同じ役目の要素を並べました。dependencies の語()が のに当たります。当たらないのは、Maven が ので BOM と手順の既定を受け取るのに対し、Gradle はを適用して受け取る点、プロジェクト名が別ファイルにある点、Maven の test スコープ1つが Gradle では2つに分かれる点、(コンパイルと実行に使う JDK の指定)と (コンパイルの対象版)が同じものではない点です。

build.gradle(Gradle 9.7.1)と pom.xml(Maven 3.9.16)の対応。どちらも start.spring.io の Boot 4.1.1 雛形表
plugins { id 'java' }
pom.xml : (書かない。packaging の既定 jar)
違い : Maven は packaging で手順が決まる。
Gradle はプラグインがタスクを足す
 
id 'org.springframework.boot'
pom.xml : <build><plugins> の spring-boot-maven-plugin
 
id 'io.spring.dependency-management'
pom.xml : <parent> spring-boot-starter-parent
(その親が BOM の spring-boot-dependencies)
違い : Gradle に親 POM の継承は無い。
プラグインが BOM を取り込む
 
group = / version =
pom.xml : <groupId> / <version>
 
(settings.gradle の rootProject.name)
pom.xml : <artifactId>
違い : Gradle では別ファイルにある
 
java { toolchain { languageVersion = ...of(25) } }
pom.xml : <properties><java.version>25
違い : toolchain はコンパイルと実行に使う JDK の指定。
java.version は親 POM 経由で
maven.compiler.release に渡るコンパイルの対象版
 
repositories { mavenCentral() }
pom.xml : (書かない。Super POM の central が既定)
 
implementation '...'
pom.xml : <dependency>(scope 省略 = compile)
 
runtimeOnly '...'
pom.xml : <scope>runtime</scope>
 
testImplementation '...' / testRuntimeOnly '...'
pom.xml : <scope>test</scope>(1つだけ)
違い : Gradle はコンパイル用と実行用に分かれる
 
(書かない)
pom.xml : <modelVersion>4.0.0(POM の書式の版)
<name> <description> <url> <licenses>
(ビルドに影響しない説明の欄)

図やコードに出てくる用語(タップで説明)