Gradle 基础:简介、安装与项目初始化
我记得刚接触 Gradle 那会儿,心里还挺抵触的。习惯了 Maven 那种“约定大于配置”的 XML 写法,突然看到一个基于 Groovy(后来还有 Kotlin)的构建脚本,总觉得不踏实。但干了几周就真香了——你想想看,一个能写循环条件、能自定义 Task、还能直接用 DSL 描述依赖关系的构建工具,比 Maven 舒服太多了。
Gradle 是什么?为什么选它?
Gradle 本质上是一个开源的项目自动化构建工具。它整合了 Ant 的灵活性和 Maven 的约定管理,背后是基于有向无环图(DAG)的任务调度机制。说白了,你告诉它“我要做 A,A 依赖 B”,它就会自动把 B 跑完再跑 A,还不重复执行。
我曾在几个微服务项目里对比过 Maven 和 Gradle 的构建速度。同样的代码,Gradle 的增量编译和缓存机制能省下 30%~50% 的时间。尤其当你每天要发布十几次的时候,这几分钟的价值就出来了。
- 基于 DAG 的任务执行引擎
- 完善的增量编译与缓存
- 支持 Groovy 和 Kotlin 两种 DSL
- 天然兼容 Maven 和 Ivy 仓库
环境安装:别被版本坑了
安装这事,我建议你直接用 SDKMAN(Linux / macOS)或者 Chocolatey(Windows)。手动下载解压也行,但容易忘掉环境变量。我个人习惯用 SDKMAN,一条命令搞定切换版本。
曾经有一次我在 CI 机器上装了 Gradle 7.0,本地用 6.9.2,结果 @TaskAction 的行为变化让构建炸了半小时。所以记牢:项目和 CI 的 Gradle 版本必须一致。
gradle wrapper 生成 gradlew 脚本,把版本锁在项目里,再也不用担心环境不一致。
安装步骤(以 macOS 为例)
- 安装 SDKMAN:
curl -s "https://get.sdkman.io" | bash - 列出可用版本:
sdk list gradle - 安装指定版本:
sdk install gradle 8.5 - 验证:
gradle --version
在 Windows 上也可以用 Chocolatey:choco install gradle。装完后记得重启终端,不然环境变量不生效。嗯,这个坑我踩过一次。
项目初始化:从零到跑起来
装好之后,咱们试试创建一个最简单的 Java 项目。Gradle 提供 init 命令,可以交互式生成骨架。
mkdir gradle-demo
cd gradle-demo
gradle init
命令会问你一堆问题:项目类型(java-application? library?)、DSL 语言(Groovy / Kotlin)、构建脚本命名……我个人建议新手先用 Groovy 版,社区示例多,踩坑容易搜。等你熟练了再转 Kotlin DSL,写起来更安全(编译时检查)。
初始化完成后,项目结构长这样:
gradle-demo/
├── build.gradle // 构建脚本
├── settings.gradle // 项目设置
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew // Unix 包装脚本
└── gradlew.bat // Windows 包装脚本
你可能会问:怎么没有 src?别急,init 命令默认只生成构建文件和包装器,源码需要手动建或者用 java-library 模板。我建议直接用 gradle init --type java-application,这样会自带头文件测试代码。
settings.gradle 里定义了项目名称和模块结构。如果你是单体项目,里面就一行 rootProject.name = 'xxx'。但如果你要搞多模块,这里得配 include 'submodule'。我曾经把一个模块名写错了,编译一直报类找不到……花了一个小时才找到是 settings 里大小写不一致。别学我。
构建脚本的基本结构:看懂 build.gradle
打开 build.gradle(如果你选了 Kotlin DSL,那就是 build.gradle.kts),你会发现里面的内容和 Maven 的 pom.xml 思路很像,但写法更简洁。下面是一个典型的结构:
plugins {
id 'java' // 应用 Java 插件
id 'application' // 让项目可执行
}
group = 'com.example' // 组织标识
version = '1.0.0' // 项目版本
repositories {
mavenCentral() // 从 Maven 中央仓库拉依赖
}
dependencies {
implementation 'com.google.guava:guava:31.1-jre' // 编译+运行时依赖
testImplementation 'org.junit.jupiter:junit-jupiter:5.9.2' // 仅测试
}
application {
mainClass = 'com.example.Main' // 入口类
}
tasks.named('test') {
useJUnitPlatform() // 启用 JUnit 5
}
这段脚本做了四件事:
- 插件声明:
java插件提供编译、测试、打包等任务;application插件让你能运行gradle run。 - 项目信息:group 和 version 后面会组成坐标,例如
com.example:gradle-demo:1.0.0。 - 仓库和依赖:
repositories告诉 Gradle 去哪找 jar;dependencies里每个配置(implementation、testImplementation)对应不同的作用域。 - 任务配置:比如测试框架选型,或者自定义任务。
你看,相比 Maven 的 XML,Gradle 省掉了大量无意义的标签。而且你可以在脚本里写 if/else、循环、甚至调用 Java 类——这灵活性是 XML 给不了的。
知识结构一览
我把这一章的核心概念画成了一张图,方便你整体把握:
核心概念速查表
| 概念 | 作用 | 常用场景 |
|---|---|---|
| Project | 代表一个项目模块,拥有自己的构建脚本 | 多模块项目中每个子模块是一个 Project |
| Task | 可执行的最小工作单元(compileJava、test) | gradle build 背后包含几十个 Task |
| Plugin | 扩展构建能力的插件包 | java、application、maven-publish |
| Configuration | 依赖的作用域分组 | implementation、testImplementation、api |
嗯,这张表里的内容你刚开始记不住也没关系。我会在后续课程里反复用到它们。你只要明白:Gradle 的一切都是 Task,依赖管理只是 Task 执行前准备好 classpath 而已。
gradle tasks 看所有可用任务。我当时靠这个命令理解插件的功能。特别是 gradle tasks --all 能显示所有包括依赖任务,调试神器。