1. Gradle入门:Gradle是什么、Gradle与Maven对比、Gradle核心概念(Project、Task、Plugin)、安装与Hello World
大家好,欢迎来到这门课。我是你们的Gradle向导。
说实话,我接触Gradle已经快十年了。从最早在Android项目里被它折腾得够呛,到现在每天靠它吃饭——嗯,这中间踩过的坑,够写一本《Gradle血泪史》了。今天咱们就从零开始,把Gradle这玩意儿彻底搞明白。
1.1 Gradle到底是什么?
Gradle,说白了就是一个构建自动化工具。你写代码,它帮你把代码变成能跑的程序。就这么简单。
但为什么不用Makefile?为什么不用Ant?为什么不用Maven?
因为Gradle更聪明。它基于有向无环图(DAG)来管理任务依赖。什么意思?就是它知道哪个任务先跑、哪个后跑,而且只跑那些真正需要跑的任务。我在项目中遇到过很多次,改了一行代码,整个项目重新编译半小时——用Gradle之后,增量编译让这个时间缩短到了几秒。
核心要点:Gradle = 构建工具 + 依赖管理 + 自动化脚本。它用Groovy或Kotlin写脚本,比Maven的XML灵活得多。
1.2 Gradle vs Maven:一场旷日持久的争论
每次技术选型,总有人问我:Gradle和Maven到底选哪个?
我个人习惯这样看:
| 对比维度 | Gradle | Maven |
|---|---|---|
| 构建脚本 | Groovy/Kotlin DSL(代码即配置) | XML(配置即配置) |
| 性能 | 增量构建、构建缓存、并行执行 | 全量构建为主,增量能力弱 |
| 依赖管理 | 动态版本、依赖约束、强制版本 | 依赖传递、排除规则 |
| 扩展性 | Task + Plugin,几乎无限 | Plugin + Mojo,但XML限制多 |
| 学习曲线 | 陡峭(但值得) | 平缓(但上限低) |
| 社区生态 | Android默认、Spring Boot支持 | Java老牌、企业级成熟 |
你想想看,Maven的XML写起来有多痛苦?改个依赖版本要翻半天pom.xml。Gradle里一行implementation 'com.google.guava:guava:32.1.3-jre'就搞定了。
我的建议:新项目用Gradle。老项目如果已经是Maven,迁移成本高的话可以继续用。但如果你做Android开发——不好意思,你没得选,Gradle是唯一答案。
1.3 Gradle核心概念:Project、Task、Plugin
这三个概念,是Gradle的基石。搞懂了它们,你就掌握了Gradle的80%。
1.3.1 Project(项目)
每个build.gradle文件对应一个Project。Project是构建的基本单元。单模块项目只有一个Project,多模块项目有根Project和子Project。
我记得第一次接触多模块项目时,被allprojects和subprojects搞晕了。后来才明白:allprojects包括根项目自己,subprojects只包括子项目。就这么简单。
1.3.2 Task(任务)
Task是Gradle里最小的工作单元。编译、打包、测试、部署——全都是Task。
你可以这样定义一个Task:
tasks.register('hello') {
doLast {
println 'Hello, Gradle!'
}
}
跑一下:gradle hello,控制台就会打印出那句话。
避坑指南:我曾经在Task里直接写println,结果发现每次配置阶段都会执行。记住:doLast里的代码才是执行阶段跑的,外面的代码是配置阶段跑的。这个区别,后面讲构建生命周期时会细说。
1.3.3 Plugin(插件)
Plugin是Gradle的扩展机制。它把一堆相关的Task和配置打包在一起,方便复用。
比如Java插件:
plugins {
id 'java'
}
就这么一行,你就有了compileJava、processResources、test、jar等几十个Task。是不是很爽?
这三个概念的关系,我画了张图:
1.4 安装Gradle
安装Gradle有两种方式。我个人推荐用SDKMAN,干净利落。
方式一:SDKMAN(推荐)
# 安装SDKMAN
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
# 安装Gradle
sdk install gradle 8.6
# 验证
gradle --version
方式二:手动安装
- 从 https://gradle.org/releases/ 下载二进制包
- 解压到
/opt/gradle或任意目录 - 配置环境变量
GRADLE_HOME和PATH
小技巧:安装完成后,运行 gradle --version 看看输出。如果看到 Groovy: 3.0.x 和 Kotlin: 1.9.x,说明安装成功。这两个语言你都可以用来写构建脚本。
1.5 Hello World:第一个Gradle项目
光说不练假把式。咱们来写一个真正的Hello World。
第一步:创建项目目录
mkdir gradle-hello
cd gradle-hello
第二步:创建build.gradle
// build.gradle
tasks.register('hello') {
doLast {
println 'Hello, Gradle!'
println '当前Gradle版本: ' + gradle.gradleVersion
}
}
第三步:运行
gradle hello
你会看到类似这样的输出:
> Task :hello
Hello, Gradle!
当前Gradle版本: 8.6
BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed
看到了吗?BUILD SUCCESSFUL。就这么简单。
注意:输出里的 :hello 表示这是根项目的hello任务。如果是子项目,会显示 :subproject:hello。这个命名规则,后面讲多模块时会用到。
第四步:加点料——依赖管理
咱们再写一个带依赖的版本:
// build.gradle
plugins {
id 'java'
}
repositories {
mavenCentral()
}
dependencies {
implementation 'com.google.guava:guava:32.1.3-jre'
}
tasks.register('hello') {
doLast {
println 'Hello, Gradle with Guava!'
println 'Guava版本: ' + com.google.common.base.Throwables.class.package.implementationVersion
}
}
跑一下 gradle hello,Gradle会自动下载Guava依赖,然后执行任务。
避坑指南:我曾经在没加 repositories 的情况下直接写 dependencies,结果Gradle报错说找不到仓库。记住:repositories 告诉Gradle去哪里下载依赖,dependencies 告诉它下载什么。两个缺一不可。
1.6 本章小结
好了,咱们把Gradle的入门知识过了一遍:
- Gradle是什么:一个基于DAG的构建自动化工具,比Maven更灵活、更快
- Gradle vs Maven:Gradle用DSL、支持增量构建、扩展性更强;Maven用XML、生态成熟但上限低
- 三大核心概念:Project(项目单元)、Task(工作单元)、Plugin(扩展机制)
- 安装与Hello World:SDKMAN安装,写一个简单的Task,引入Java插件和依赖
嗯,这些内容看起来简单,但都是后面所有高级特性的基础。你想想看,如果连Task和Plugin都搞不清楚,后面怎么玩增量构建?怎么开发自定义插件?
下一章,咱们会深入Gradle的构建生命周期——配置阶段、执行阶段到底是怎么回事,为什么Task的配置代码不能乱写。到时候我会分享一个我踩过的坑,保证让你印象深刻。
公众号:蓝海资料掘金营,微信deep3321