Gradle简介
# Gradle 简介
# 为什么需要了解 Gradle
如果你一直用 Maven,可能会遇到这些场景:
- 构建脚本不够灵活:想在打包时自动执行一段自定义逻辑,Maven 需要写插件或 Mojo,门槛较高。
- 大型项目构建慢:Maven 的构建是线性的,Gradle 支持增量编译和并行构建,大型项目提速明显。
- Spring Boot 官方推荐:从 Spring Boot 2.x 开始,官方文档的示例逐步转向 Gradle;Spring Boot 4.x 的起步依赖在 Gradle 下体验更好。
- Android 生态:Android 项目官方构建工具就是 Gradle,绕不开。
简单说:Maven 够用,Gradle 更灵活、更快。如果你在做 Spring Boot 4 / Android / 现代化 Java 项目,Gradle 是值得投入学习的。
# Gradle 是什么
Gradle 是一个基于 Groovy/Kotlin DSL 的自动化构建工具,结合了 Ant 的灵活性和 Maven 的约定优于配置思想。
核心特点:
| 特点 | 说明 |
|---|---|
| DSL 驱动 | 用 Groovy 或 Kotlin 编写构建脚本,而非 XML |
| 约定优于配置 | 内置标准项目结构(类似 Maven),零配置即可上手 |
| 增量构建 | 只编译变更过的文件,二次构建速度极快 |
| 构建缓存 | 跨项目、跨机器复用构建产物 |
| 并行构建 | 多模块项目可并行执行无依赖的 task |
| 可编程 | 构建脚本本身就是代码,可直接写 if/for、调用方法 |
# 核心概念
# Project(项目)
每次运行 Gradle 构建时,会创建一个或多个 Project 对象。单模块项目只有一个 Project,多模块项目(如 settings.gradle 中 include 了多个子项目)每个模块对应一个 Project。
# Task(任务)
Task 是 Gradle 构建的最小执行单元,类似于 Maven 的 goal。一个 Project 包含多个 Task,Task 之间可以声明依赖关系(dependsOn),Gradle 会按依赖顺序执行。
// 定义一个简单的 task
task hello {
doLast {
println 'Hello Gradle!'
}
}
2
3
4
5
6
执行:gradlew hello
# Plugin(插件)
Plugin 是一组 Task 和约定的集合,用于扩展 Gradle 的能力。例如 java 插件提供了编译、测试、打包等标准 Task;org.springframework.boot 插件提供了 bootRun、bootJar 等 Task。
plugins {
id 'java' // Java 构建
id 'org.springframework.boot' // Spring Boot
id 'io.spring.dependency-management' // 依赖管理
}
2
3
4
5
这和 Maven 的插件概念类似,但 Gradle 插件更像是"功能包",一个插件带来一整套 Task 和约定。
# Groovy DSL vs Kotlin DSL
Gradle 支持两种脚本语言编写构建文件:
| 对比项 | Groovy DSL | Kotlin DSL |
|---|---|---|
| 文件名 | build.gradle | build.gradle.kts |
| 语法风格 | 动态、简洁、灵活 | 静态、类型安全、IDE 补全好 |
| 学习曲线 | 低,容错性强 | 中,需了解 Kotlin 语法 |
| IDE 支持 | 一般 | 优秀(IntelliJ 原生支持) |
| 官方趋势 | 仍广泛使用 | 官方推荐新项目使用 |
选择建议:如果你从 Maven 转过来、追求快速上手,先用 Groovy DSL;如果是新项目且团队熟悉 Kotlin,用 Kotlin DSL 获得更好的类型安全和 IDE 体验。
本文以 Groovy DSL 为主进行讲解,因为上手更直观,且大量开源项目(如 Spring Boot 源码示例)仍在使用。涉及 Kotlin DSL 差异时会特别标注。
# Gradle vs Maven 全面对比
| 对比维度 | Maven | Gradle |
|---|---|---|
| 构建文件 | pom.xml(XML 声明式) | build.gradle / build.gradle.kts(代码式) |
| 灵活性 | 低,扩展需写插件 | 高,脚本可直接编程 |
| 构建速度 | 较慢(全量构建) | 快(增量编译 + 构建缓存 + 并行) |
| 依赖管理 | <dependencies> + scope | dependencies + configuration(更细粒度) |
| 版本管理 | <dependencyManagement> / BOM | Version Catalog(libs.versions.toml) |
| 多模块 | 父子 POM 继承 | settings.gradle + include |
| 生命周期 | 三套固定生命周期 | Task 图 + 依赖驱动 |
| 学习曲线 | 低,约定固定 | 中,需理解 DSL 和 Task 模型 |
| 生态 | 最成熟,插件最多 | 快速增长,Spring/Android 主推 |
# 依赖声明对比
Maven(XML):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>3.2.0</version>
</dependency>
2
3
4
5
Gradle(Groovy DSL):
implementation 'org.springframework.boot:spring-boot-starter-web:3.2.0'
Gradle 用一行字符串
group:name:version就能声明一个依赖,比 Maven 的 XML 标签简洁很多。
# 构建脚本对比
Maven 要在打包阶段执行自定义逻辑,需要配置插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<configuration>
<tasks>
<echo>Building project...</echo>
</tasks>
</configuration>
<goals><goal>run</goal></goals>
</execution>
</executions>
</plugin>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Gradle 直接在脚本里写代码:
tasks.named('jar') {
doFirst {
println 'Building project...'
}
}
2
3
4
5
# Gradle 的优缺点
# 优点
- 构建速度快:增量编译 + 构建缓存 + 守护进程(Daemon),二次构建通常比 Maven 快数倍。
- 灵活可编程:构建脚本就是代码,条件判断、循环、方法调用信手拈来。
- 依赖配置细粒度:
implementation/api/compileOnly/runtimeOnly等配置项比 Maven 的 scope 更精确。 - Version Catalog:用 TOML 文件集中管理依赖版本,比 Maven 的
dependencyManagement更直观。 - 现代化生态:Spring Boot、Android 官方主推,社区活跃。
# 缺点
- 学习曲线:需要理解 DSL、Task 模型、Configuration 等概念。
- 构建脚本可能变复杂:灵活性是双刃剑,缺乏约束时脚本容易膨胀。
- 版本兼容性:Gradle 大版本升级偶尔有 breaking change,插件版本需匹配。
- 企业级成熟度:Maven 在传统企业中仍占主流,部分内部基建对 Gradle 支持不完善。
# 实际项目示例
以 interview-guide (opens new window) 项目为例,这是一个 Spring Boot 4.1 + Java 25 + Spring AI 2.0 的项目,使用 Gradle 构建。
项目根目录的关键文件:
interview-guide/
├── settings.gradle # 多项目配置,声明包含哪些子项目
├── gradle.properties # Gradle 全局属性(JDK 路径、JVM 参数)
├── gradle/
│ ├── libs.versions.toml # Version Catalog,集中管理依赖版本
│ └── wrapper/ # Gradle Wrapper,锁定 Gradle 版本
├── gradlew / gradlew.bat # Wrapper 脚本,无需本地安装 Gradle
├── app/ # 子项目
│ └── build.gradle # 子项目构建脚本
└── build/ # 构建输出目录
2
3
4
5
6
7
8
9
10
settings.gradle 声明了项目结构和插件仓库:
pluginManagement {
repositories {
maven { url = uri('https://maven.aliyun.com/repository/public/') }
maven { url = uri('https://maven.aliyun.com/repository/gradle-plugin/') }
gradlePluginPortal()
}
}
rootProject.name = 'interview-guide'
include('app')
2
3
4
5
6
7
8
9
10
app/build.gradle 中的核心配置:
plugins {
id 'java'
alias(libs.plugins.spring.boot)
alias(libs.plugins.spring.dependency.management)
}
group = 'com.interview'
version = '0.0.1-SNAPSHOT'
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-webmvc'
runtimeOnly 'org.postgresql:postgresql'
compileOnly libs.lombok
annotationProcessor libs.lombok
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
后续文章会逐一拆解这些配置的含义。