Gradle

返回构建工具


核心概念

  • 使用 Groovy DSLKotlin 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
apilib 模块用,依赖方可见
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.ktsallprojects / 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 版本

提交到版本控制:gradlewgradlew.batgradle/wrapper/gradle-wrapper.jargradle/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        # 生成构建性能报告