1、Gradle简介与安装
1.1 Gradle的发展历史
我刚开始接触构建工具时,用的是 Ant,后来又切到 Maven。说实话,Maven 的约定优于配置确实方便,但写自定义逻辑时 xml 文件写得让人头疼。直到 2007 年,Gradle 诞生了。
Gradle 最初是作为嵌入式项目的一部分开发的,后来在 2012 年开源。它用 Groovy 写构建脚本,后来又支持 Kotlin DSL。我记得 2015 年左右,Gradle 在 Android 构建上站稳了脚跟——Google 官方把它定为默认构建工具。从那以后,Gradle 的生态就彻底爆发了。
| 时间 | 里程碑 |
|---|---|
| 2007 | Gradle 原型开发 |
| 2012 | Gradle 1.0 发布,支持 Groovy DSL |
| 2015 | Android 官方支持 Gradle,成为 Android 默认构建工具 |
| 2017 | Gradle 4.0 引入 Kotlin DSL |
| 2020 | Gradle 6.0 正式将 Kotlin DSL 提升为头等公民 |
| 2024 | Gradle 8.x,持续优化构建性能和依赖管理 |
为什么 Gradle 能后来居上?说白了,它把 Ant 的灵活性和 Maven 的约定结合了起来,再加上基于有向无环图的增量构建,跑构建速度快了不少。
1.2 Gradle的核心特性
我这些年用 Gradle 的感受,以下几个特性最实在:
- 基于任务(Task)的构建模型——每个构建动作都是一个 Task,Task 之间可以依赖、可以分组,执行时自动按依赖顺序跑。
- 增量构建——只有输入输出发生变化的 Task 才会重新执行。我曾在一次大型重构后发现构建时间从 15 分钟降到了 2 分钟,就是这个特性的功劳。
- 灵活的 DSL——Groovy 或 Kotlin 写脚本,比 xml 直观得多。你可以在 build.gradle 里直接写 if-else、循环,甚至自定义扩展。
- 依赖管理——支持 Maven 中央仓库、JCenter、本地文件等,自带依赖版本锁定和传递依赖排除。
- 多项目构建——微服务项目里,一个根项目下面几十个子项目,Gradle 通过 settings.gradle 统一管理,非常方便。
- 缓存和远程缓存——别人跑过的构建结果,你可以直接拉下来复用,团队协作时效率翻倍。
⚠️ 核心概念:Gradle 里的“依赖”不只是 jar 包,还包括任务间的依赖关系。理解了这个,后面配置多模块项目时就不会糊涂了。
1.3 安装与配置
安装 Gradle 其实很简单,但我遇到过几种坑,一并告诉你。
前置条件
- JDK 8 以上(建议 JDK 17 LTS,Gradle 8.x 对 JDK 17 支持最好)
- 设置
JAVA_HOME环境变量
安装方式(推荐手动解压)
我个人习惯用 SDKMAN 管理,不过很多公司环境不允许装 SDKMAN,所以手动安装更通用:
- 从 Gradle 官网下载对应版本的 binary-only 包
- 解压到自定义目录,比如
C:\gradle-8.6 - 添加
gradle的 bin 目录到系统 PATH - 设置
GRADLE_HOME环境变量
# Linux / macOS
export GRADLE_HOME=/opt/gradle-8.6
export PATH=$GRADLE_HOME/bin:$PATH
# Windows 设置完记得重启终端验证
💡 验证安装:终端执行 gradle -v。我碰到过新同事没加 PATH,直接运行报“不是内部命令”,检查一下环境变量就好。
配置 Gradle 用户级设置
Gradle 有一个 ~/.gradle/gradle.properties 文件(Windows 是 %USERPROFILE%\.gradle)。我建议把以下配置写进去,能省不少麻烦:
# 设置并行编译
org.gradle.parallel=true
# 开启构建缓存
org.gradle.caching=true
# JVM 参数(建议 1/4 物理内存)
org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m
⚠️ 我曾经吃过亏:在 Jenkins 上忘记设置缓存目录,导致每次打包都重新下载所有插件。记得把 .gradle 目录加入公司网络共享盘,或者配置远程缓存。
1.4 基本命令实战
安装好之后,我们跑几个命令感受一下。
| 命令 | 用途 |
|---|---|
gradle help | 显示所有可用任务和选项 |
gradle tasks | 列出当前项目的任务树 |
gradle dependencies | 显示项目依赖树(非常关键) |
gradle build | 执行完整构建(编译、测试、打包) |
gradle clean build | 先清理再构建 |
gradle test --tests *UserService* | 按模式执行特定测试 |
gradle --console rich build | 启用彩色输出,阅读更舒服 |
我在项目中经常用 gradle dependencies 来检查是否有冲突或版本重叠。比如想找出 slf4j 的传递依赖,直接 gradle dependencies --configuration compileClasspath,一目了然。
# 实际输出示例(部分)
compileClasspath - Compile classpath for source set 'main'.
+--- org.springframework.boot:spring-boot-starter-web:3.2.0
| +--- org.springframework.boot:spring-boot-starter:3.2.0
| | +--- org.springframework.boot:spring-boot:3.2.0
| | +--- org.springframework.boot:spring-boot-autoconfigure:3.2.0
| | \--- org.slf4j:slf4j-api:2.0.9 -> 2.0.12
| +--- org.springframework:spring-web:6.1.0
| \--- org.springframework:spring-webmvc:6.1.0
看见那个 -> 2.0.12 了吗?这表示 Gradle 自动选择了较高的版本,避免了冲突。
知识体系总览
接下来怎么用
到这里,Gradle 已经装好、基本命令也能跑了。但说实话,这只是个开始。接下来的章节我会带你深入依赖管理的细节——比如怎么配置仓库、怎么锁定版本、怎么解决冲突。你想想看,一个项目几十个模块,几百个 jar 包,要是没点章法,光合并代码都能让人崩溃。别急,我们一步步来。