1. Gradle入门:Gradle简介、Gradle与Maven对比、Gradle核心概念、安装与配置
说实话,我第一次接触Gradle时,心里是有点抵触的。那时候Maven用得正顺手,觉得干嘛要换?直到有一次接手一个大型微服务项目,Maven的构建慢得让人抓狂,增量编译几乎等于没有。嗯,从那以后,我才真正开始认真研究Gradle。
这一章,我们就从零开始,聊聊Gradle到底是什么,它和Maven比有什么优势,以及它的核心概念和安装配置。我会结合自己踩过的坑,帮你快速上手。
1.1 Gradle简介
Gradle是一个开源的自动化构建工具。它最初是为了弥补Ant和Maven的不足而诞生的。我个人觉得,Gradle最大的特点就是「灵活」和「快」。
它基于Groovy或Kotlin DSL(领域特定语言)来编写构建脚本。这意味着你可以在构建脚本里写逻辑、写条件判断、甚至调用Java库。这在Maven的XML里是很难做到的。
举个例子,我在一个项目中需要根据不同的环境(开发、测试、生产)打包不同的配置文件。用Maven的话,我得配置多个Profile,很繁琐。用Gradle,几行代码就搞定了。
核心特点:
- 基于DSL,脚本可读性强
- 支持增量构建,只编译修改过的文件
- 强大的依赖管理,支持动态版本
- 构建缓存,多项目构建时速度提升明显
1.2 Gradle与Maven对比
很多初学者会问:Gradle和Maven到底选哪个?我的建议是:如果你是新项目,或者团队对构建速度有要求,直接上Gradle。如果是老项目,Maven用得好好的,也没必要强行迁移。
下面这张表是我根据自己的使用经验整理的,你可以直观地看看两者的区别:
| 对比维度 | Maven | Gradle |
|---|---|---|
| 构建脚本 | XML,结构固定 | Groovy/Kotlin DSL,灵活 |
| 性能 | 较慢,不支持增量编译 | 快,支持增量构建和缓存 |
| 依赖管理 | 坐标系统,稳定 | 坐标系统 + 动态版本 + 模块元数据 |
| 扩展性 | 插件机制,但开发复杂 | 插件机制,开发简单,社区活跃 |
| 学习曲线 | 较低,XML简单 | 中等,需要学DSL语法 |
你想想看,Maven的XML配置动辄几百行,而Gradle同样的功能可能只需要几十行。我记得有一次,一个同事用Maven配置多模块项目,折腾了一整天。我用Gradle,半小时就搞定了。
我的建议:如果你团队里都是Java老手,Maven用惯了,可以继续用。但如果你是新手,或者项目对构建速度有要求,直接学Gradle吧。未来趋势很明显。
1.3 Gradle核心概念
Gradle有三个核心概念:Project、Task、Plugin。理解了这三个,你就掌握了Gradle的骨架。
1.3.1 Project
Project是Gradle构建的基本单位。每个build.gradle文件对应一个Project。在单模块项目中,只有一个Project。在多模块项目中,根目录和每个子模块都是一个Project。
Project可以配置属性、定义任务、应用插件。说白了,它就是构建脚本的上下文。
// 一个简单的build.gradle
plugins {
id 'java'
}
group = 'com.example'
version = '1.0.0'
repositories {
mavenCentral()
}
dependencies {
implementation 'com.google.guava:guava:31.1-jre'
}
1.3.2 Task
Task是Gradle执行的最小工作单元。每个Task完成一个具体的操作,比如编译代码、运行测试、打包JAR。
你可以自定义Task,也可以使用Gradle内置的Task(比如clean、build、test)。
// 自定义一个Task
tasks.register('hello') {
doLast {
println 'Hello, Gradle!'
}
}
我在项目中遇到过一个问题:多个Task之间有依赖关系,但执行顺序总是乱。后来发现,Gradle的Task执行顺序不是按定义顺序来的,而是按依赖关系来的。你需要用dependsOn来显式声明。
避坑指南:我曾经在写自定义Task时,忘了加doLast,结果Task里的代码在配置阶段就执行了,而不是执行阶段。记住:doLast里的代码才是真正在Task执行时运行的。
1.3.3 Plugin
Plugin是Gradle的扩展机制。它可以把一组相关的Task和配置打包起来,方便复用。比如Java插件,它会自动添加compileJava、processResources、test等Task。
Gradle有两种插件:脚本插件和二进制插件。二进制插件又分为核心插件(如java、application)和社区插件(如spring-boot)。
// 应用Java插件
plugins {
id 'java'
}
// 应用Spring Boot插件
plugins {
id 'org.springframework.boot' version '3.2.0'
}
我个人习惯,尽量使用二进制插件,因为版本管理更方便。脚本插件虽然灵活,但容易造成构建脚本混乱。
1.4 安装与配置
安装Gradle其实很简单。我建议你使用SDKMAN来管理Gradle版本,这样切换版本非常方便。
1.4.1 安装方式
有两种主流方式:
- 手动安装:下载二进制包,解压,配置环境变量
- SDKMAN安装:一行命令搞定,推荐
// 使用SDKMAN安装Gradle
sdk install gradle 8.5
// 查看已安装版本
gradle --version
如果你用的是Windows,手动安装时记得把GRADLE_HOME和PATH配置好。我曾经因为路径里有空格,导致Gradle死活找不到JDK,折腾了半天。
小技巧:安装完成后,可以配置GRADLE_USER_HOME环境变量,指定Gradle的缓存目录。默认在用户目录下,容易占满C盘。我一般把它改到D盘。
1.4.2 配置Gradle Wrapper
Gradle Wrapper是Gradle官方推荐的方式。它会把Gradle版本信息固化在项目中,团队成员不需要手动安装Gradle,直接运行./gradlew命令即可。
// 生成Wrapper文件
gradle wrapper --gradle-version 8.5
// 项目结构
my-project/
├── gradlew
├── gradlew.bat
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
└── build.gradle
我强烈建议所有项目都使用Wrapper。你想想看,如果团队里有人用Gradle 7.0,有人用8.0,构建结果可能都不一样。Wrapper能保证所有人用同一个版本。
注意:Wrapper的gradle-wrapper.properties文件一定要提交到版本控制里。我见过有人把它加到.gitignore里,结果新同事拉下来代码后,Wrapper自动下载了最新版Gradle,和项目不兼容。
1.5 知识体系总览
下面这张图,是我为你梳理的本章知识体系。你可以把它当作一个地图,随时回来查阅。
好了,这一章的内容就到这里。Gradle入门其实不难,关键是理解它的设计理念:灵活、快速、可扩展。下一章我们会深入Task的细节,到时候再聊。
公众号:蓝海资料掘金营,微信deep3321