サンプルコードで身につける: Gradle: build.gradle を1行ずつ読む
解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。
1build.gradle の全文(Groovy DSL)
が生成した 4.1.1 / Java 25 / 依存 web の雛形の です(28行)。強調した の3行が依存で、に版が書かれていません。ソースや出力の場所、コンパイルして にする手順もどこにも書かれていません。
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 はサイズが同じで、 のエントリ一覧は完全に一致しました。
plugins {javaid("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.gradlerootProject.name = 'demo'# gradle/wrapper/gradle-wrapper.propertiesdistributionBase=GRADLE_USER_HOMEdistributionPath=wrapper/distsdistributionUrl=https\://services.gradle.org/distributions/gradle-9.7.1-bin.zipnetworkTimeout=10000retries=0retryBackOffMs=500validateDistributionUrl=truezipStoreBase=GRADLE_USER_HOMEzipStorePath=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 になりました。
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 runtimeClasspathorg.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 の指定)と (コンパイルの対象版)が同じものではない点です。
plugins { id 'java' }pom.xml : (書かない。packaging の既定 jar)違い : Maven は packaging で手順が決まる。Gradle はプラグインがタスクを足すid 'org.springframework.boot'pom.xml : <build><plugins> の spring-boot-maven-pluginid '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>(ビルドに影響しない説明の欄)