⭐表示重要。

第一章:Gradle 操作命令(⭐)

1.1 概述

  • Gradle 和 Maven 是属于同等类型的构建工具,所以在 Gradle 之中也存在有大量的构建命令,利用这些命令可以实现程序的清理、编译、测试、打包等操作。

1.2 操作上一章节的 Java 项目

  • 如果要想进行命令的操作,可以直接使用 IDEA 工具所提供的快捷方式:

1.png

  • 但是,考虑到实际的项目部署环境(实际的项目部署环境可没有 IDEA ),本次将直接使用命令行的模式来进行处理操作(通过 cmd 命令启动命令行 )。
  • 需要保证当前项目所在的路径下存在有 build.gradle 的配置文件,这个和 Maven 项目编译的主目录(pom.xml)功能相同。
  • 在当前的程序编译处理之中,会发现存在一个非常头疼的编码问题,因为在使用 IDEA 工具的时候,IDEA 工具会自动的帮助开发者进行一些编码的配置,而如果使用命令行模式进行编译,那么就必须进行乱码的解决,在 Gradle 之中乱码的解决依靠的是任务的概念完成的,需要编写 build.gradle 配置文件,追加编码任务的配置。
  1. plugins {
  2. id 'java' // 配置的是一个 Java 插件(Java 项目)
  3. }
  4. group 'com.github.fairy.era' // 组织名称
  5. version '1.0' // 项目版本
  6. sourceCompatibility = 11 // 源代码版本
  7. repositories { // 仓库配置
  8. mavenCentral()
  9. }
  10. dependencies { // 依赖管理
  11. testImplementation group: 'junit', name: 'junit', version: '4.13.2'
  12. }
  13. tasks.withType(JavaCompile){ // 针对程序编译的任务进行配置
  14. options.encoding = "UTF-8"
  15. }
  • 程序编译命令:
  1. gradle build

2.gif

  • 如果此时编译的是其他人的开发代码,那么有可能没有其他人电脑上的测试环境,换言之,此时的 junit 测试用例出现了错误,那么理论上是无法编译通过的。
  • 修改当前的测试代码:
  1. package com.fairy.era.service;
  2. import com.github.fairy.era.service.IMessageService;
  3. import com.github.fairy.era.service.impl.MessageServiceImpl;
  4. import org.junit.Assert;
  5. import org.junit.Test;
  6. /**
  7. * @author 许大仙
  8. * @since 2021-12-19 22-33
  9. */
  10. public class MessageServiceTest {
  11. @Test
  12. public void test() {
  13. IMessageService messageService = new MessageServiceImpl();
  14. String msg = messageService.echo("你好啊");
  15. Assert.assertEquals("hello-gradle 你好啊", msg);
  16. }
  17. }
  • 再次,执行编译命令:
  1. gradle build

3.gif

  • 因为此时的测试代码出现了问题,所以自然无法编译成功,所以最简单的解决方式,就是直接跳过测试:
  1. gradle build -x test

4.gif

  • 继续回到之前的程序代码上,就是测试代码出现了问题,但是在进行编译的时候不跳过测试:
  1. gradle build

5.gif

  • 会发现执行了 build 之后,命令行中出现了如上图所示的一行提示信息,这个就是测试报告。

6.gif

  • 在整个的 Gradle 里面,如果出现了一些错误的测试操作,那么可以直接通过这样的测试报告来进行观察,这个功能是属于 Gradle 独有的,同时也是 Maven 所没有直接提供的。
  • 如果此时需要清空所有的编译后的处理结果,那么只需要执行如下的命令即可:
  1. gradle clean

7.gif

  • 在进行编译的时候,如果硬件资源丰富,我们肯定会选择开启多线程的并发编译操作,实际上这样的操作,Gradle 也是可以实现的,只需要在 Gradle 的工作目录(GRADLE_USER_HOME 环境变量对应的路径)中创建 gradle.properties 文件即可,内容如下:
  1. # 让 Gradle 工作在后台,采用后台线程的形式来进行处理,新版本的 Gradle 全部工作在后台
  2. org.gradle.daemon=true
  3. # 启用 Gradle 多线程工作环境
  4. org.gradle.parallel=true

1.3 操作上一章节的 JavaWeb 项目

  • 本项目是属于一个 JavaWeb项目,既然是 JavaWeb 项目,就需要考虑将其做不同的打包处理,例如:*.jar*.war
  • 将此项目打包成 *.jar 文件:
  1. gradle jar

8.gif

  • 将此项目打包成 *.war 文件:
  1. gradle war

9.gif

  • 在使用 Gradle 进行编译的时候,也可以通过 --profile 配置获取相关的执行报告信息:
  1. gradle build --profile

10.gif

第二章:Gradle 整合 Junit 5(⭐)

2.1 概述

  • junit 长期以来一直维持在 4.x 状态,但是因为传统的 junit 方式已经不适合于当前的测试环境,所以 junit 的开发者就创建了一个新的 junit 项目 — junit 5。

11.png

  • 新版本的 junit 5 ,其组织已经更换为 org.junit.jupiter

2.2 针对上一章节的 Java项目,进行 junit 5 的整合。

  • 既然要进行项目依赖的添加,那么就需要找到 junit 5 的相关类库坐标(同时,删除 Junit 4.x 对应的坐标):
  1. plugins {
  2. id 'java' // 配置的是一个 Java 插件(Java 项目)
  3. }
  4. group 'com.github.fairy.era' // 组织名称
  5. version '1.0' // 项目版本
  6. sourceCompatibility = 11 // 源代码版本
  7. repositories { // 仓库配置
  8. mavenCentral()
  9. }
  10. dependencies { // 依赖管理
  11. /* junit 5 */
  12. testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.8.2'
  13. }
  14. tasks.withType(JavaCompile) { // 针对程序编译的任务进行配置
  15. options.encoding = "UTF-8"
  16. }
  • 修改 MessageServiceTest 的代码,通过 junit 5 来进行测试代码的编写:
  1. package com.fairy.era.service;
  2. import com.github.fairy.era.service.IMessageService;
  3. import com.github.fairy.era.service.impl.MessageServiceImpl;
  4. import org.junit.jupiter.api.Assertions;
  5. import org.junit.jupiter.api.Test;
  6. /**
  7. * @author 许大仙
  8. * @since 2021-12-19 22-33
  9. */
  10. public class MessageServiceTest {
  11. @Test
  12. public void test() {
  13. IMessageService messageService = new MessageServiceImpl();
  14. String msg = messageService.echo("gradle");
  15. Assertions.assertEquals("hello gradle", msg);
  16. }
  17. }
  • 此时,如果使用 IDEA 运行上面的代码,会出现如下的错误信息:

12.gif

  • 但是,通过 gradle build 命令进行编译的时候,却能编译通过:
  1. gradle build

13.gif

  • 在传统使用 junit 4 的时候,项目中只需要引入一个 junit 4 的依赖库即可解决所有问题:
  1. plugins {
  2. id 'java' // 配置的是一个 Java 插件(Java 项目)
  3. }
  4. group 'com.github.fairy.era' // 组织名称
  5. version '1.0' // 项目版本
  6. sourceCompatibility = 11 // 源代码版本
  7. repositories { // 仓库配置
  8. mavenCentral()
  9. }
  10. dependencies { // 依赖管理
  11. testImplementation group: 'junit', name: 'junit', version: '4.13.2'
  12. }
  13. tasks.withType(JavaCompile){ // 针对程序编译的任务进行配置
  14. options.encoding = "UTF-8"
  15. }
  • 但是,在 junit 5 中已经将一个依赖库拆分成了三个依赖库:

14.png

  • 修改项目中的 build.gradle 的配置文件,在里面引入和 junit5 相关的其他依赖库:
  1. plugins {
  2. id 'java' // 配置的是一个 Java 插件(Java 项目)
  3. }
  4. group 'com.github.fairy.era' // 组织名称
  5. version '1.0' // 项目版本
  6. sourceCompatibility = 11 // 源代码版本
  7. repositories { // 仓库配置
  8. mavenCentral()
  9. }
  10. dependencies { // 依赖管理
  11. /* junit 5 */
  12. testImplementation group: 'org.junit.platform', name: 'junit-platform-launcher', version: '1.8.2'
  13. testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.8.2'
  14. testImplementation group: 'org.junit.vintage', name: 'junit-vintage-engine', version: '5.8.2'
  15. testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.8.2'
  16. }
  17. tasks.withType(JavaCompile) { // 针对程序编译的任务进行配置
  18. options.encoding = "UTF-8"
  19. }
  • 当然,如何你觉得麻烦的话,也可以使用 junit 5 的聚合包:
  1. plugins {
  2. id 'java' // 配置的是一个 Java 插件(Java 项目)
  3. }
  4. group 'com.github.fairy.era' // 组织名称
  5. version '1.0' // 项目版本
  6. sourceCompatibility = 11 // 源代码版本
  7. repositories { // 仓库配置
  8. mavenCentral()
  9. }
  10. dependencies { // 依赖管理
  11. /* junit 5 */
  12. testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter', version: '5.8.2'
  13. }
  14. tasks.withType(JavaCompile) { // 针对程序编译的任务进行配置
  15. options.encoding = "UTF-8"
  16. }
  • 如果现在要想使用 junit 5 到项目之中,还需要追加一个新的测试任务的配置(因为默认情况下的 Gradle 支持的是 junit 4),所以需要修改 build.gradle 配置文件,追加新的测试任务配置:
  1. plugins {
  2. id 'java' // 配置的是一个 Java 插件(Java 项目)
  3. }
  4. group 'com.github.fairy.era' // 组织名称
  5. version '1.0' // 项目版本
  6. sourceCompatibility = 11 // 源代码版本
  7. repositories { // 仓库配置
  8. mavenCentral()
  9. }
  10. dependencies { // 依赖管理
  11. /* junit 5 */
  12. testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter', version: '5.8.2'
  13. }
  14. test { // 进行测试任务的配置
  15. useJUnitPlatform() // 使用 Junit 平台
  16. }
  17. tasks.withType(JavaCompile) { // 针对程序编译的任务进行配置
  18. options.encoding = "UTF-8"
  19. }

第三章:Gradle Wrapper(⭐)

  • 在传统项目的开发过程之中,如果使用了 Maven 进行项目的构建,那么就会面临这样的情况:在开发者电脑上和项目部署服务器上都需要配置相同的 Maven 版本,随后才能保证程序的正常编译执行。但是在 Gradle 的时代中,Gradle 觉得这样的配置过于繁琐,所以为了简化 Gradle 的操作就提供了一个 Gradle Wrapper 的概念,利用这一概念可以直接在项目中自带 Gradle 的运行环境(当然,现在 Maven 也提供了这一功能)。
  • 通过命令行方式进入到任意的一个目录中,执行如下的命令:
  1. gradle wrapper

15.gif

  • Gradle 安装包中的命令文件 VS 通过 gradle wrapper 命令生成的命令文件:

16.png

  • 此时,生成了一个名为 gradlew.bat(原始的命令是 gradle.bat ),这里的 w 就是 wrapper 的简写,同时还会生成若干个目录(比如:.gradle 目录 和 gradle 目录 及其子目录),换言之,通过 IDEA 工具创建的 Gradle 项目结构和现在通过 gradle wrapper 创建的项目结构是一样的。
  • Gradle Wrapper 的作用就是简化 Gradle 本身的安装、部署,避免由于 Gradle 版本不同所带来的各种问题: | 文件 | 描述 | | —- | —- | | gradlew.bat | gradlew.bat 是 .bat 的脚本,Windows 用户可以通过它执行 Gradle 的任务,配置 gradle 文件夹使用;Linux 系统使用的是 gradlew ,gradlew 是一个 shell 脚本,Linux 用户通过它来执行 Gradle 的任务。 | | gradle-wrapper.jar | gradle-wrapper.jar 是 Gradle Wrapper 的主体功能包(Wrapper的代码所在),项目打包必须有,不然无法执行 gradlew。 | | gradle-wrapper.properities | gradle-wrapper.properities 文件主要指定了该目录需要什么版本的 Gradle,从哪里下载该版本的 Gradle ,下载下来放到哪里。 |
  • 使用 Gradle Wrapper 一个最大的特点,就是可以基于其工具切换不同的 Gradle 版本,基于上一章节的 Java 项目,执行如下的命令:
  1. gradle wrapper --gradle-version 7.3

17.gif

  • 上面的命令的含义就是将当前的 Gradle 版本切换为 7.3 ,切换完成之后,最明显的变化就是在 gradle-wrapper.properties 文件中的内容发生了变化。
  1. distributionBase=GRADLE_USER_HOME
  2. distributionPath=wrapper/dists
  3. distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip
  4. zipStoreBase=GRADLE_USER_HOME
  5. zipStorePath=wrapper/dists

18.png

  • 由于此时已经切换了 Gradle 内置的 Wrapper 版本,那么在项目进行编译处理的时候就会自动下载对应的 Gradle 工具。
  • 此时,可以在项目中使用 gradlew 代替 gradle 命令,这样,即使团队内的成员使用的 Gradle 版本和我们的 Gradle 版本不一样(甚至他压根就不想安装本地 Gradle),那么也没什么关系。
  1. gradlew build

19.gif

第四章:Gradle 代码分析器(⭐)

4.1 概述

  • 所有开发人员编写的代码,在程序上线之前都需要进行性能的检测,对于使用 Gradle 工具构建的项目来说,也需要清楚知道项目构建的情况,包括:构建环境、依赖库以及程序性能上存在的问题,这样方便和别人进行交流。
  • 为了解决这样的构建问题,Gradle 就提供了一个 Build Scan 的代码扫描工具,这个工具会自动的将本地构建的过程发送到指定的服务器端,并且由服务器端生成一个完整的报告。

4.2 操作上一章节的 Java 项目

  • 如果要想使用这种扫描报告,只需要在程序编译的时候设置一些指令即可:
  1. gradlew build --scan

20.gif

  • 当构建分析报告上传到服务器后,会给出一个服务器访问地址,可以通过这个地址查看报告信息。

21.gif

  • 开发人员和运维人员就可以依据此报告无缝沟通了。