第一章: Gradle 简介
- Gradle 是一款 的
基于 JVM
、通用灵活的项目构建工具
,支持 Maven、Jcenter 等第三方仓库,支持传递依赖管理,并且废弃了繁杂的 xml 文件,转而使用简洁的、支持多种语言
(如:Java、C++、Python 等)的build 脚本文件
。 - Gradle 的官网地址。
- 学习 Gradle 的原因:
- 目前已经有相当一部分公司在逐渐使用 Gradle 作为项目构建工具。
- Spring 项目已经转向使用 Gradle 作为项目构建工具。
- 总之,虽然目前市面上常见的项目构建工具有 Ant 、Maven、Gradle ,并且目前主流的还是 Maven ,但是 Gradle 是趋势。
第二章:常见的项目构建工具
2.1 Ant
- Ant 是 Apache 组织在 2000 年推出的纯 Java 编写的构建工具,通过 xml (build.xml) 文件管理项目。
- Ant 的优点是:使用灵活,速度快。
- Ant 的缺点:Ant 没有强加任何编码约定的项目目录结构,开发人员需要编写繁琐的 XML 文件构建指令,对开发人员是一个挑战。
2.2 Maven
- Maven 是 Apache 组织在 2004 年推出的再次使用 xml (pom.xml)文件管理的项目构建工具。
- Maven 的优点:遵循一套约定大于配置的项目目录结构,使用统一的
GAV
坐标进行依赖管理,侧重于包管理
。 - Maven 的缺点:项目构建过程僵化,配置文件编写不够灵活,不方便自定义组件,构建速度慢于 Gradle 。
2.3 Gradle
- Gradle 是在 2012 年推出的基于 Groovy 语言的全新项目构建工具(后期也支持 Kotlin 语言),集合了 Ant 和 Maven 各自的优势。
- Gradle 的优点:集 Ant 脚本的灵活性 + Maven 约定大于配置的项目目录优势,支持多种远程仓库和插件,
侧重于大型项目的构建
。 - Gradle 的缺点:学习成本高,资料少,脚本灵活,版本兼容差等。
2.4 对比
自动化构建工具对比 | Ant | Maven | Gradle |
---|---|---|---|
构建性能 | 最高 | 最低 | 中等 |
仓库 | 开发者自己处理 | Maven 仓库 | 支持多种远程仓库 |
依赖管理 | ivy 管理 | GAV 坐标管理 | GNV 坐标管理 |
插件支持 | 实现方便 | 实现较难 | 实现方便 |
遵循特定目录结构 | × | √ | √(同 Maven ) |
配置文件 | xml 文件最为繁琐 | xml 文件 | 代码脚本,便于写业务逻辑 |
侧重点 | 小型项目构建 | 项目包管理 | 大型项目构建 |
目前地位 | 使用较少 | 目前主流 | 未来趋势(Spring 助力) |
第三章:Gradle 安装
3.1 Gradle 安装说明
- SpringBoot 官方文档明确指出,目前 SpringBoot 的 Gradle 插件需要 Gradle 6.8 以上版本,所以我们选择 7.x 的版本。
- 其中,SpringBoot 和 Gradle 存在版本兼容的问题(这就是 Gradle 快的原因所在,不怎么兼容以前的版本),Gradle 和 IDEA 也存在兼容问题,所以选择 Gradle 6.8+ 的版本,也需要将 IDEA 的版本进行升级。
3.2 安装 JDK
- 略(JDK 1.8+)。
3.3 下载并解压到指定目录
- 下载(网速不行,请点这里gradle-7.4.2-all.zip):
- 本次解压到
D:\develop\gradle-7.4.2
目录中。
3.4 配置环境变量
- 建议用户变量和系统变量都配置下,本次以用户变量为例。
- 配置
GRADLE_HOME
:
- 配置
GRADLE_USER_HOME
:
注意:需要提前在
D:\develop\gradle-7.4.2
目录中新建repository
目录,这个目录相当于 Gradle 的本地仓库位置以及 Gradle Wrapper 缓存目录。
- 将
%GRADLE_HOME%\bin
配置到 Path 中:
3.5 检测是否安装成功
- 命令:
gradle -v
第四章:Gradle 项目目录结构
- Gradle 项目
默认目录结构和 Maven 项目的目录结构一致
,遵循约定大于配置
,其完整项目目录结构如下所示:
注意:
- 目前,新版本的 Maven 也有 wrapper 了。
- 只有 war 工程才有 webapp 目录,普通的 Java 工程是没有 webapp 目录的。
- gradlew 和 gradlew.bat 执行的是指定 wrapper 版本中的 gradle 指令,并不是本地安装的 gradle 的指令,这样做的好处是,每个人电脑安装的 Gradle 版本可能不同,但是可以通过 wrapper 实现环境的统一,换言之,通过 gradle wrapper 本地甚至可以不用安装 Gradle 。
第五章:使用 Gradle 创建项目
5.1 借助 Spring 的脚手架创建 Gradle 项目
- Spring 脚手架的地址:https://start.spring.io/ 。
- 查看生成的 Gradle 项目目录结构:
- 总体的目录结构和上述所说的目录结构基本一致。
5.2 使用命令行的方式创建 Gradle 项目
- 新建一个空的目录:
- 进入刚才创建的目录,使用 gradle init 命令初始化 Gradle 项目:
gradle init
- 查看生成的 Gradle 项目目录结构:
- 虽然貌似和 Spring 的脚手架不一样,因为没有 src 目录,而是 app 目录,这个目录相当于 Gradle 项目的子模块。
5.3 Gradle 中的常用指令
Gradle 常用指令 | 作用 |
---|---|
gradle clean | 清空 build 目录 |
gradle classes | 编译业务代码和配置文件 |
gradle test | 编译测试代码,生成测试报告 |
gradle build | 构建项目 |
gradle build -x test | 跳过测试构建项目 |
注意:执行 gradle 指令需要在含有 build.gradle(构建脚本) 的目录执行,正如执行 mvn 指令需要在含有 pom.xml 文件的目录执行。
5.4 修改 Maven 下载源
5.4.1 概述
- Gradle 自带的 Maven 源地址是在国外,该 Maven 源在国内的访问速度很慢。一般情况下,我们建议使用国内的第三方开放的 Maven 源或企业内部自建 Maven 源。
5.4.2 创建 init.gradle 文件
- 我们可以在 Gradle 安装的目录中的 init.d 目录中创建一个以
.gradle
结尾的文件,.gradle
文件可以实现在 build 之前执行,我们可以在这个文件中配置我们预先想要加载的操作。 - 在 init.d 文件夹中创建 init.gradle 文件:
allprojects {
repositories {
mavenLocal()
maven { name "Alibaba" ; url "https://maven.aliyun.com/repository/public" }
maven { name "Bstek" ; url "https://nexus.bsdn.org/content/groups/public/" }
mavenCentral()
}
buildscript {
repositories {
maven { name "Alibaba" ; url 'https://maven.aliyun.com/repository/public' }
maven { name "Bstek" ; url 'https://nexus.bsdn.org/content/groups/public/' }
maven { name "M2" ; url 'https://plugins.gradle.org/m2/' }
}
}
}
5.4.3 启用 init.gradle 文件的方法
启用 init.gradle 文件的方法:
① 在命令行中指定文件:
# 我们可以多次输入此命令来执行多个 init 文件。
gradle --init-script yourdir/init.gradle -q taskName
② 将
init.gradle
文件放到USER_HOME/.gradle/
目录中。- ③ 将以
.gradle
结尾的文件放到USER_HOME/.gradle/init.d/
目录中。 - ④ 将以
.gradle
结尾的文件放到GRADLE_HOME/init.d/
目录中(我们使用的是这种方式)。
- 如果存在上面的 4 种方式中的 2 种以上,Gradle 会按照 ① ~ ④ 号顺序依次执行这些文件。
- 如果给定目录下存在多个 init 脚本,会按照拼音 a-z 的顺序执行这些脚本,每个 init 脚本都存在一个对应的 Gradle 实例。
- 我们在这个文件中调用的所有属性和方法,都会委托给这个 Gradle 实例,每个 init 脚本都实现了 Script 接口。
5.4.4 仓库地址说明
mavenLocal()
:指定使用 Maven 的本地仓库。Gradle 查找 jar 包顺序是:USER_HOME/.m2/settings.xml
—>M2_HOME/conf/settings.xml
—>USER_HOME/.m2/repository
。
maven { url "" }
:指定 Maven 仓库,一般用于私有仓库地址或其它的第三方库(如:阿里云 Maven 中央仓库)。mavenCentral()
:Maven 的中央仓库,无需配置,直接声明即可使用。
注意:
- Gradle 可以通过指定仓库地址为本地 Maven 仓库地址和远程仓库地址相结合的方式,避免了每次都会去远程仓库下载依赖库。
- 如果本地 Maven 仓库中有这个依赖,就会直接加载本地依赖。如果本地 Maven 仓库没有该依赖,还是会从远程仓库下载的。下载的 jar 不是存储在本地的 Maven 仓库中,而是放在自己的缓存目录中,默认是在
USER_HOME/.gradle/caches
目录。如果我们配置了GRADLE_USER_HOME
这个环境变量,则会放到GRADLE_USER_HOME/caches
目录中。
5.5 Gradle Wrapper 包装器
5.5.1 概述
- Gradle Wrapper 实际上是对 Gradle 的一层包装,
用于解决
实际开发中可能会遇到的不同的项目需要不同版本的 Gradle 问题
。 - 例如:将自己的代码共享给其他人使用的时候,可能会出现如下的情况
- ① 对方的电脑没有安装 Gradle 。
- ② 对方电脑安装过 Gradle ,但是版本太旧。
- 这个时候,我们就可以考虑使用 Gradle Wrapper 了。这也是官方建议使用 Gradle Wrapper 的原因,实际上有了 Gradle Wrapper 之后,我们本地就可以不配置 Gradle 了。当下载了 Gradle 项目之后,使用 Gradle 项目自带的 wrapper 操作也是可以的。
5.5.2 如何使用 Gradle Wrapper ?
- 项目中的 gradlew (Linux平台)和 gradle.bat (win平台)脚本就是 Gradle Wrapper 中规定的 Gradle 脚本。
- 我们上面提到的 gradle 指令使用的是本地安装的 Gradle ,并且 gradle 指令和 gradlew 指令所使用到的 Gradle 版本可能不一样。但是,gradlew 的使用方式和 gradle 的使用方式是完全一致的,只不过将 gradle 指令换成了 gradlew 指令。
- 当然,我们也可以在终端执行 gradle wrapper 指令的时候,指定一些参数来控制 Wrapper 的生成,如:依赖的版本。 | 参数名 | | | —- | —- | | —gradle-version | 用于指定使用的 Gradle Wrapper 的版本 | | —gradle-distribution-url | 用于指定下载 Gradle Wrapper 的 URL 地址 | | —distribution-type all | 用于关联源码 |
- 升级 Gradle Wrapper 的版本:
gradle wrapper --gradle-version=7.4.2
注意:只是修改 gradle.properties 中的 Wrapper 版本,实际上是没有下载的。
5.5.3 Gradle Wrapper 的执行流程
- Gradle Wrapper 的执行流程:
- ① 当我们第一次执行
./gradlew.bat build
命令的时候,./gradlew.bat
会读取 gradle-wrapper.properties 文件中的配置信息。
- ① 当我们第一次执行
- ② 准确将指定版本的 Gradle Wrapper 下载到指定的位置(GRADLE_USER_HOME 目录下的 wrapper/dists 目录)。
- ③ 构建本地缓存(GRADLE_USER_HOME 目录下的 caches 目录中),下次再使用相同版本的 Gradle Wrapper 就不用再次下载了。
- ④ 之后执行的
./gradlew.bat
命令都是使用指定的 Gradle Wrapper 版本。- gradle-wrapper.properties 文件:
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
字段名 | 说明 |
---|---|
distributionBase | 下载的 Gradle Wrapper 压缩包解压后存储的主目录 |
distributionPath | 相对于 distributionBase 的解压后的 Gradle Wrapper 压缩包的路径 |
distributionUrl | Gradle Wrapper 压缩包的下载地址 |
zipStoreBase | 同 distributionBase ,只不过存放的是 zip 压缩包的 |
zipStorePath | 同 distributionPath ,只不过存放的是 zip 压缩包的 |
注意:前提我们配置了 Gradle_USER_HOME 环境变量用于这里的 Gradle Wrapper 下载的存储目录,但是如果没有配置此环境变量,那么就会在当前用户的家目录的 .gradle 文件夹中。
5.5.4 什么时候选择 Gradle Wrapper ?
- 下载别人的项目或者操作以前自己写的不同版本的 Gradle 项目的时候,使用 Gradle Wrapper,即
./gradlew
或./gradlew.bat
指令。 - 如果是新建的项目,那么直接使用本地安装的 Gradle ,即 gradle 指令。