Gradle
→ 返回构建工具
核心概念
- 使用 Groovy DSL 或 Kotlin DSL 编写构建脚本(
build.gradle/build.gradle.kts) - 基于有向无环图(DAG)任务驱动,而非固定生命周期阶段
- 增量构建:只重新执行输入/输出发生变化的任务
- 构建缓存:跨项目、跨机器复用任务输出,显著提升 CI 速度
基本结构
// build.gradle.kts
plugins {
id("java")
id("org.springframework.boot") version "3.2.0"
id("io.spring.dependency-management") version "1.1.4"
}
group = "com.example"
version = "0.0.1-SNAPSHOT"
java {
sourceCompatibility = JavaVersion.VERSION_21
}
repositories {
mavenCentral()
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-web")
testImplementation("org.springframework.boot:spring-boot-starter-test")
}依赖配置(Configuration)
| 配置 | 编译 | 运行 | 暴露给依赖方 | 说明 |
|---|---|---|---|---|
| implementation | ✓ | ✓ | ✗ | 最常用,替代旧 compile |
| api | ✓ | ✓ | ✓ | lib 模块用,依赖方可见 |
| compileOnly | ✓ | ✗ | ✗ | 类似 Maven provided |
| runtimeOnly | ✗ | ✓ | ✗ | 类似 Maven runtime |
| testImplementation | ✓(test) | ✓(test) | ✗ | 仅测试 |
| testCompileOnly | ✓(test) | ✗ | ✗ | 测试编译时 |
implementation vs api:使用 implementation 可避免依赖泄漏,减少不必要的重新编译。
任务(Task)
Gradle 构建由任务组成,任务间通过 dependsOn 声明依赖关系。
内置常用任务:
./gradlew tasks # 列出所有可用任务
./gradlew build # compileJava → test → jar
./gradlew clean # 删除 build/
./gradlew test # 运行测试
./gradlew jar # 打 jar
./gradlew assemble # 打包但不运行测试
./gradlew check # 运行测试和静态分析自定义任务:
tasks.register("hello") {
doLast {
println("Hello, Gradle!")
}
}增量构建
Gradle 通过比较任务的**输入(inputs)和输出(outputs)**决定是否跳过执行:
tasks.register<Copy>("copyFiles") {
inputs.dir("src/resources")
outputs.dir("build/resources")
from("src/resources")
into("build/resources")
}任务标注 UP-TO-DATE 表示输入输出未变化,跳过执行。
多模块项目
root/
├── settings.gradle.kts ← 声明所有子模块
├── build.gradle.kts ← 根配置(公共插件/依赖)
├── module-a/
│ └── build.gradle.kts
└── module-b/
└── build.gradle.kts
settings.gradle.kts:
rootProject.name = "my-project"
include("module-a", "module-b")根 build.gradle.kts 用 allprojects / subprojects 统一配置:
subprojects {
apply(plugin = "java")
repositories { mavenCentral() }
}Version Catalog(统一版本管理)
gradle/libs.versions.toml:
[versions]
spring-boot = "3.2.0"
junit = "5.10.0"
[libraries]
spring-boot-web = { module = "org.springframework.boot:spring-boot-starter-web", version.ref = "spring-boot" }
junit-jupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit" }
[plugins]
spring-boot = { id = "org.springframework.boot", version.ref = "spring-boot" }build.gradle.kts 中引用:
dependencies {
implementation(libs.spring.boot.web)
testImplementation(libs.junit.jupiter)
}构建缓存
# 本地缓存(默认开启)
./gradlew build --build-cache
# 远程缓存(在 settings.gradle.kts 配置)
buildCache {
remote<HttpBuildCache> {
url = uri("https://cache.example.com/cache/")
push = System.getenv("CI") != null
}
}CI 环境推送缓存,本地开发拉取缓存,大型项目构建时间可减少 50%+。
Gradle Wrapper
项目应提交 Wrapper,保证所有人使用相同 Gradle 版本:
./gradlew wrapper --gradle-version 8.5 # 升级 Wrapper 版本提交到版本控制:gradlew、gradlew.bat、gradle/wrapper/gradle-wrapper.jar、gradle/wrapper/gradle-wrapper.properties。
常用命令
./gradlew build # 完整构建
./gradlew test # 运行测试
./gradlew clean build # 清理后重新构建
./gradlew :module-a:test # 只构建指定模块
./gradlew dependencies # 查看依赖树
./gradlew dependencies --configuration runtimeClasspath
./gradlew bootRun # 启动 Spring Boot
./gradlew --parallel build # 并行构建多模块
./gradlew --profile build # 生成构建性能报告