woodwhales's blog

技术改变生活

gradle 入门学习笔记

安装 gradle

gradle 官网:https://gradle.org/

gradle 所有版本下载:https://gradle.org/releases/

gradle 与 IDEA 版本兼容确认

在 IDEA 安装目录的 plugins\gradle\lib 下有如下gradle相关 jar 文件:

笔者是 7.4 版本,点击下载二进制文件链接即可下载 gradle 文件:

注意:

完整版是包含了 gradle 的文档和源码

安装 gradle 必须要求系统有安装 JDK 1.8 +

官方安装说明:https://docs.gradle.org/current/userguide/installation.html

具体安装教程请移步至:构建工具maven及gradle的安装及IDE配置

gradle 项目目录结构

Gradle 项目默认目录结构和Maven 项目的目录结构一致,都是基于约定大于配置【Convention Over Configuration】。其完整项目目录结构如下所示:

上图说明:

  1. 只有 war 工程才有 webapp 目录,对于普通的 jar 工程并没有 webapp 目录。
  2. gradlew 与 gradlew.bat 执行的 wrapper 目录下的 gradle 指令,不是本地安装的 gradle 指令。
  3. 因此如果仅仅使用本地 gradle 构建项目,可以删除 gradlew、gradlew.bat、wrapper文件(及子文件),但是不是可以删除 gradle 文件目录。
  4. gradle 的 build 目录与 maven 的 target 目录类似,gradle 的 src 目录与 maven 的 src 目录一样。
  5. 一个工程只有一个 settings.gradle 文件,即 maven 的父子工程中的父工程目录下含该文件,其他子工程不含该文件。
  6. gradle 的 build.gradle 文件与 maven 的 pom.xml 文件类似,一个 project 就含有一个该文件。

创建 gradle 项目

使用 spring 或者 aliyun 提供的脚手架创建基础的 gradle 项目:

https://start.aliyun.com/bootstrap.html

https://start.spring.io/

将下载的 gradle 项目压缩文件解压,得到如下目录结构:

上述文件目录中没有 build 目录,因为项目没有编译,等项目编译之后就会有 build 目录了。

gradle 常用命令

gradle 常用命令 作用
gradle clean 清空 build 目录
gradle classes 编译 src 目录下的代码
gradle test 编译测试代码,生成测试报告
gradle build 构建项目
gradle build -x test 构建项目但是跳过构建测试代码

注意:gradle 的指令要在含有 build.gradle 的目录位置才能执行。

编译测试代码之后,在 build\reports\tests\test 文件目录下有测试报告。

build 成功的 jar 包在 build\libs 文件目录下。

添加镜像

Gradle 自带的 Maven 源地址是国外的,该 Maven 源在国内的访问速度是很慢的,除非使用了特别的手段。一般情况下,我们建议使用国内的第三方开放的 Maven 源或企业内部自建 Maven 源。

我们可以在gradle 的init.d 目录下创建以.gradle 结尾的文件,.gradle 文件可以实现在build 开始之前执行,所以可以在这个文件配置一些你想预先加载的操作。

init.d文件夹创建init.gradle文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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/' }
}
}
}

mavenLocal():指定使用maven本地仓库,而本地仓库在配置maven时settings文件指定的仓库位置。gradle 查找 jar包顺序如下:USER_HOME/.m2/settings.xml >> M2_HOME/conf/settings.xml >> USER_HOME/.m2/repository。

阿里云仓库地址请参考:https://developer.aliyun.com/mvn/guide

启用 init.gradle 文件的方法

  1. 在命令行指定文件,例如:gradle –init-script yourdir/init.gradle -q taskName。可以多次输入此命令来指定多个 init.gradle 文件
  2. 把 init.gradle 文件放到 USER_HOME/.gradle/ 目录下
  3. 把以 .gradle 结尾的文件放到 USER_HOME/.gradle/init.d/ 目录下
  4. 把以 .gradle 结尾的文件放到 GRADLE_HOME/init.d/ 目录下

如果存在上面的 4 种方式的 2 种以上,gradle 会按上面的 1-4 序号依次执行这些文件,如果给定目录下存在多个 init 脚本,会按拼音 a-z 顺序执行这些脚本,每个 init 脚本都存在一个对应的 gradle 实例。

gradle 拉取远程依赖存储过程

gradle 可以通过指定仓库地址为本地 maven 仓库地址和远程仓库地址相结合的方式,避免每次都会去远程仓库下载依赖库。这种方式也有一定的问题,如果本地 maven 仓库有这个依赖,就会从直接加载本地依赖,如果本地仓库没有该依赖,那么还是会从远程下载。但是下载的 jar 不是存储在本地 maven 仓库中,而是放在自己的缓存目录中,默认在 USER_HOME/.gradle/caches 目录,如果我们配置过GRADLE_USER_HOME环境变量,则会放在GRADLE_USER_HOME/caches 目录中。因为 caches下载的文件不是按照 maven 仓库中存放的方式存储,所以gradle 不可以将 gradle caches 指向 maven repository。

Wrapper 包装器

Gradle Wrapper 实际上就是对 Gradle 的一层包装,用于解决实际开发中可能会遇到的不同的项目需要不同版本的 Gradle。

例如:把自己的代码共享给其他人使用,可能出现如下情况:

  1. 对方电脑没有安装 gradle
  2. 对方电脑安装过 gradle,但是版本太旧了

这时候,我们就可以考虑使用官方推荐的 Gradle Wrapper,上有了 Gradle Wrapper 之后,我们本地是可以不配置 Gradle 系统环境变量,下载 Gradle 项目后,使用 gradle 项目中自带的 wrapper 配置可以完成项目构建。

项目中的 gradlew、gradlew.bat 脚本用的就是 wrapper 中规定的gradle版本。

修改 wrapper 中的 gradle 版本

使用指令:

1
gradle wrapper --gradle-version=7.4.2

下述是一个 wrapper 配置:

1
2
3
4
5
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

上述 wrapper 配置意味着第一次使用 gradlew 或者 gradlew.bat 脚本执行项目构建时,从 distributionUrl 配置的地址下载 gradle 压缩包,保存到 zipStoreBase 和 zipStorePath 配置的文件目录中,解压 gradle 压缩包并保存至 distributionBase 和 distributionPath 配置的文件目录中。

wrapper 执行流程

  1. 当我们第一次执行 ./gradlew build 命令的时候,gradlew 会读取 gradle-wrapper.properties 文件的配置信息
  2. 准确的将指定版本的 gradle 下载并解压到指定的位置( GRADLE_USER_HOME 目录下的 wrapper/dists 目录中)
  3. 并构建本地缓存(GRADLE_USER_HOME目录下的caches目录中),下次再使用相同版本的 gradle 就不用下载了
  4. 之后执行的 ./gradlew 所有命令都是使用指定的 gradle 版本。