第一章: Gradle 简介

  • Gradle 是一款 的 基于 JVM 、通用灵活的 项目构建工具 ,支持 Maven、Jcenter 等第三方仓库,支持传递依赖管理,并且废弃了繁杂的 xml 文件,转而使用 简洁的、支持多种语言(如:Java、C++、Python 等)的 build 脚本文件
  • Gradle 的官网地址

1.png

  • 学习 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 的版本。

4.png

  • 其中,SpringBoot 和 Gradle 存在版本兼容的问题(这就是 Gradle 快的原因所在,不怎么兼容以前的版本),Gradle 和 IDEA 也存在兼容问题,所以选择 Gradle 6.8+ 的版本,也需要将 IDEA 的版本进行升级。

5.png

3.2 安装 JDK

  • 略(JDK 1.8+)。

3.3 下载并解压到指定目录

6.png

  • 本次解压到 D:\develop\gradle-7.4.2 目录中。

7.png

3.4 配置环境变量

  • 建议用户变量和系统变量都配置下,本次以用户变量为例。

8.png

  • 配置 GRADLE_HOME

9.png

  • 配置 GRADLE_USER_HOME

10.png

注意:需要提前在 D:\develop\gradle-7.4.2 目录中新建 repository 目录,这个目录相当于 Gradle 的本地仓库位置以及 Gradle Wrapper 缓存目录。

  • %GRADLE_HOME%\bin 配置到 Path 中:

11.png

3.5 检测是否安装成功

  • 命令:
  1. gradle -v

12.png

第四章:Gradle 项目目录结构

  • Gradle 项目 默认目录结构和 Maven 项目的目录结构一致 ,遵循 约定大于配置 ,其完整项目目录结构如下所示:

13.png

注意:

  • 目前,新版本的 Maven 也有 wrapper 了。
  • 只有 war 工程才有 webapp 目录,普通的 Java 工程是没有 webapp 目录的。
  • gradlew 和 gradlew.bat 执行的是指定 wrapper 版本中的 gradle 指令,并不是本地安装的 gradle 的指令,这样做的好处是,每个人电脑安装的 Gradle 版本可能不同,但是可以通过 wrapper 实现环境的统一,换言之,通过 gradle wrapper 本地甚至可以不用安装 Gradle 。

第五章:使用 Gradle 创建项目

5.1 借助 Spring 的脚手架创建 Gradle 项目

14.PNG

  • 查看生成的 Gradle 项目目录结构:

15.PNG

  • 总体的目录结构和上述所说的目录结构基本一致。

5.2 使用命令行的方式创建 Gradle 项目

  • 新建一个空的目录:

16.PNG

  • 进入刚才创建的目录,使用 gradle init 命令初始化 Gradle 项目:
  1. gradle init

17.PNG

  • 查看生成的 Gradle 项目目录结构:

18.PNG

  • 虽然貌似和 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 文件:
  1. allprojects {
  2. repositories {
  3. mavenLocal()
  4. maven { name "Alibaba" ; url "https://maven.aliyun.com/repository/public" }
  5. maven { name "Bstek" ; url "https://nexus.bsdn.org/content/groups/public/" }
  6. mavenCentral()
  7. }
  8. buildscript {
  9. repositories {
  10. maven { name "Alibaba" ; url 'https://maven.aliyun.com/repository/public' }
  11. maven { name "Bstek" ; url 'https://nexus.bsdn.org/content/groups/public/' }
  12. maven { name "M2" ; url 'https://plugins.gradle.org/m2/' }
  13. }
  14. }
  15. }

19.PNG

5.4.3 启用 init.gradle 文件的方法

  • 启用 init.gradle 文件的方法:

    • ① 在命令行中指定文件:

      1. # 我们可以多次输入此命令来执行多个 init 文件。
      2. 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

20.PNG

  • 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 脚本。

21.PNG

  • 我们上面提到的 gradle 指令使用的是本地安装的 Gradle ,并且 gradle 指令和 gradlew 指令所使用到的 Gradle 版本可能不一样。但是,gradlew 的使用方式和 gradle 的使用方式是完全一致的,只不过将 gradle 指令换成了 gradlew 指令。

22.PNG

  • 当然,我们也可以在终端执行 gradle wrapper 指令的时候,指定一些参数来控制 Wrapper 的生成,如:依赖的版本。 | 参数名 | | | —- | —- | | —gradle-version | 用于指定使用的 Gradle Wrapper 的版本 | | —gradle-distribution-url | 用于指定下载 Gradle Wrapper 的 URL 地址 | | —distribution-type all | 用于关联源码 |
  • 升级 Gradle Wrapper 的版本:
  1. gradle wrapper --gradle-version=7.4.2

注意:只是修改 gradle.properties 中的 Wrapper 版本,实际上是没有下载的。

23.gif

5.5.3 Gradle Wrapper 的执行流程

24.png

  • Gradle Wrapper 的执行流程:
    • ① 当我们第一次执行 ./gradlew.bat build 命令的时候,./gradlew.bat 会读取 gradle-wrapper.properties 文件中的配置信息。

25.gif

  • ② 准确将指定版本的 Gradle Wrapper 下载到指定的位置(GRADLE_USER_HOME 目录下的 wrapper/dists 目录)。

26.PNG

  • ③ 构建本地缓存(GRADLE_USER_HOME 目录下的 caches 目录中),下次再使用相同版本的 Gradle Wrapper 就不用再次下载了。

27.PNG

  • ④ 之后执行的 ./gradlew.bat 命令都是使用指定的 Gradle Wrapper 版本。
    • gradle-wrapper.properties 文件:
  1. distributionBase=GRADLE_USER_HOME
  2. distributionPath=wrapper/dists
  3. distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip
  4. zipStoreBase=GRADLE_USER_HOME
  5. 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 指令。