⭐表示重要。
第一章:Gradle 操作命令(⭐)
1.1 概述
- Gradle 和 Maven 是属于同等类型的构建工具,所以在 Gradle 之中也存在有大量的构建命令,利用这些命令可以实现程序的清理、编译、测试、打包等操作。
1.2 操作上一章节的 Java 项目
- 如果要想进行命令的操作,可以直接使用 IDEA 工具所提供的快捷方式:
- 但是,考虑到实际的项目部署环境(实际的项目部署环境可没有 IDEA ),本次将直接使用命令行的模式来进行处理操作(通过
cmd
命令启动命令行 )。 - 需要保证当前项目所在的路径下存在有
build.gradle
的配置文件,这个和 Maven 项目编译的主目录(pom.xml)功能相同。 - 在当前的程序编译处理之中,会发现存在一个非常头疼的编码问题,因为在使用 IDEA 工具的时候,IDEA 工具会自动的帮助开发者进行一些编码的配置,而如果使用命令行模式进行编译,那么就必须进行乱码的解决,在 Gradle 之中乱码的解决依靠的是任务的概念完成的,需要编写
build.gradle
配置文件,追加编码任务的配置。
plugins {
id 'java' // 配置的是一个 Java 插件(Java 项目)
}
group 'com.github.fairy.era' // 组织名称
version '1.0' // 项目版本
sourceCompatibility = 11 // 源代码版本
repositories { // 仓库配置
mavenCentral()
}
dependencies { // 依赖管理
testImplementation group: 'junit', name: 'junit', version: '4.13.2'
}
tasks.withType(JavaCompile){ // 针对程序编译的任务进行配置
options.encoding = "UTF-8"
}
- 程序编译命令:
gradle build
- 如果此时编译的是其他人的开发代码,那么有可能没有其他人电脑上的测试环境,换言之,此时的 junit 测试用例出现了错误,那么理论上是无法编译通过的。
- 修改当前的测试代码:
package com.fairy.era.service;
import com.github.fairy.era.service.IMessageService;
import com.github.fairy.era.service.impl.MessageServiceImpl;
import org.junit.Assert;
import org.junit.Test;
/**
* @author 许大仙
* @since 2021-12-19 22-33
*/
public class MessageServiceTest {
@Test
public void test() {
IMessageService messageService = new MessageServiceImpl();
String msg = messageService.echo("你好啊");
Assert.assertEquals("hello-gradle 你好啊", msg);
}
}
- 再次,执行编译命令:
gradle build
- 因为此时的测试代码出现了问题,所以自然无法编译成功,所以最简单的解决方式,就是直接跳过测试:
gradle build -x test
- 继续回到之前的程序代码上,就是测试代码出现了问题,但是在进行编译的时候不跳过测试:
gradle build
- 会发现执行了 build 之后,命令行中出现了如上图所示的一行提示信息,这个就是测试报告。
- 在整个的 Gradle 里面,如果出现了一些错误的测试操作,那么可以直接通过这样的测试报告来进行观察,这个功能是属于 Gradle 独有的,同时也是 Maven 所没有直接提供的。
- 如果此时需要清空所有的编译后的处理结果,那么只需要执行如下的命令即可:
gradle clean
- 在进行编译的时候,如果硬件资源丰富,我们肯定会选择开启多线程的并发编译操作,实际上这样的操作,Gradle 也是可以实现的,只需要在 Gradle 的工作目录(GRADLE_USER_HOME 环境变量对应的路径)中创建
gradle.properties
文件即可,内容如下:
# 让 Gradle 工作在后台,采用后台线程的形式来进行处理,新版本的 Gradle 全部工作在后台
org.gradle.daemon=true
# 启用 Gradle 多线程工作环境
org.gradle.parallel=true
1.3 操作上一章节的 JavaWeb 项目
- 本项目是属于一个 JavaWeb项目,既然是 JavaWeb 项目,就需要考虑将其做不同的打包处理,例如:
*.jar
、*.war
。 - 将此项目打包成
*.jar
文件:
gradle jar
- 将此项目打包成
*.war
文件:
gradle war
- 在使用 Gradle 进行编译的时候,也可以通过
--profile
配置获取相关的执行报告信息:
gradle build --profile
第二章:Gradle 整合 Junit 5(⭐)
2.1 概述
- junit 长期以来一直维持在 4.x 状态,但是因为传统的 junit 方式已经不适合于当前的测试环境,所以 junit 的开发者就创建了一个新的 junit 项目 — junit 5。
- 新版本的 junit 5 ,其组织已经更换为
org.junit.jupiter
。
2.2 针对上一章节的 Java项目,进行 junit 5 的整合。
- 既然要进行项目依赖的添加,那么就需要找到 junit 5 的相关类库坐标(同时,删除 Junit 4.x 对应的坐标):
plugins {
id 'java' // 配置的是一个 Java 插件(Java 项目)
}
group 'com.github.fairy.era' // 组织名称
version '1.0' // 项目版本
sourceCompatibility = 11 // 源代码版本
repositories { // 仓库配置
mavenCentral()
}
dependencies { // 依赖管理
/* junit 5 */
testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.8.2'
}
tasks.withType(JavaCompile) { // 针对程序编译的任务进行配置
options.encoding = "UTF-8"
}
- 修改 MessageServiceTest 的代码,通过 junit 5 来进行测试代码的编写:
package com.fairy.era.service;
import com.github.fairy.era.service.IMessageService;
import com.github.fairy.era.service.impl.MessageServiceImpl;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
/**
* @author 许大仙
* @since 2021-12-19 22-33
*/
public class MessageServiceTest {
@Test
public void test() {
IMessageService messageService = new MessageServiceImpl();
String msg = messageService.echo("gradle");
Assertions.assertEquals("hello gradle", msg);
}
}
- 此时,如果使用 IDEA 运行上面的代码,会出现如下的错误信息:
- 但是,通过
gradle build
命令进行编译的时候,却能编译通过:
gradle build
- 在传统使用 junit 4 的时候,项目中只需要引入一个 junit 4 的依赖库即可解决所有问题:
plugins {
id 'java' // 配置的是一个 Java 插件(Java 项目)
}
group 'com.github.fairy.era' // 组织名称
version '1.0' // 项目版本
sourceCompatibility = 11 // 源代码版本
repositories { // 仓库配置
mavenCentral()
}
dependencies { // 依赖管理
testImplementation group: 'junit', name: 'junit', version: '4.13.2'
}
tasks.withType(JavaCompile){ // 针对程序编译的任务进行配置
options.encoding = "UTF-8"
}
- 但是,在 junit 5 中已经将一个依赖库拆分成了三个依赖库:
- 修改项目中的 build.gradle 的配置文件,在里面引入和 junit5 相关的其他依赖库:
plugins {
id 'java' // 配置的是一个 Java 插件(Java 项目)
}
group 'com.github.fairy.era' // 组织名称
version '1.0' // 项目版本
sourceCompatibility = 11 // 源代码版本
repositories { // 仓库配置
mavenCentral()
}
dependencies { // 依赖管理
/* junit 5 */
testImplementation group: 'org.junit.platform', name: 'junit-platform-launcher', version: '1.8.2'
testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.8.2'
testImplementation group: 'org.junit.vintage', name: 'junit-vintage-engine', version: '5.8.2'
testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.8.2'
}
tasks.withType(JavaCompile) { // 针对程序编译的任务进行配置
options.encoding = "UTF-8"
}
- 当然,如何你觉得麻烦的话,也可以使用 junit 5 的聚合包:
plugins {
id 'java' // 配置的是一个 Java 插件(Java 项目)
}
group 'com.github.fairy.era' // 组织名称
version '1.0' // 项目版本
sourceCompatibility = 11 // 源代码版本
repositories { // 仓库配置
mavenCentral()
}
dependencies { // 依赖管理
/* junit 5 */
testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter', version: '5.8.2'
}
tasks.withType(JavaCompile) { // 针对程序编译的任务进行配置
options.encoding = "UTF-8"
}
- 如果现在要想使用 junit 5 到项目之中,还需要追加一个新的测试任务的配置(因为默认情况下的 Gradle 支持的是 junit 4),所以需要修改 build.gradle 配置文件,追加新的测试任务配置:
plugins {
id 'java' // 配置的是一个 Java 插件(Java 项目)
}
group 'com.github.fairy.era' // 组织名称
version '1.0' // 项目版本
sourceCompatibility = 11 // 源代码版本
repositories { // 仓库配置
mavenCentral()
}
dependencies { // 依赖管理
/* junit 5 */
testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter', version: '5.8.2'
}
test { // 进行测试任务的配置
useJUnitPlatform() // 使用 Junit 平台
}
tasks.withType(JavaCompile) { // 针对程序编译的任务进行配置
options.encoding = "UTF-8"
}
第三章:Gradle Wrapper(⭐)
- 在传统项目的开发过程之中,如果使用了 Maven 进行项目的构建,那么就会面临这样的情况:在开发者电脑上和项目部署服务器上都需要配置相同的 Maven 版本,随后才能保证程序的正常编译执行。但是在 Gradle 的时代中,Gradle 觉得这样的配置过于繁琐,所以为了简化 Gradle 的操作就提供了一个 Gradle Wrapper 的概念,利用这一概念可以直接在项目中自带 Gradle 的运行环境(当然,现在 Maven 也提供了这一功能)。
- 通过命令行方式进入到任意的一个目录中,执行如下的命令:
gradle wrapper
- Gradle 安装包中的命令文件 VS 通过
gradle wrapper
命令生成的命令文件:
- 此时,生成了一个名为
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 项目,执行如下的命令:
gradle wrapper --gradle-version 7.3
- 上面的命令的含义就是将当前的 Gradle 版本切换为 7.3 ,切换完成之后,最明显的变化就是在
gradle-wrapper.properties
文件中的内容发生了变化。
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
- 由于此时已经切换了 Gradle 内置的 Wrapper 版本,那么在项目进行编译处理的时候就会自动下载对应的 Gradle 工具。
- 此时,可以在项目中使用
gradlew
代替gradle
命令,这样,即使团队内的成员使用的 Gradle 版本和我们的 Gradle 版本不一样(甚至他压根就不想安装本地 Gradle),那么也没什么关系。
gradlew build
第四章:Gradle 代码分析器(⭐)
4.1 概述
- 所有开发人员编写的代码,在程序上线之前都需要进行性能的检测,对于使用 Gradle 工具构建的项目来说,也需要清楚知道项目构建的情况,包括:构建环境、依赖库以及程序性能上存在的问题,这样方便和别人进行交流。
- 为了解决这样的构建问题,Gradle 就提供了一个
Build Scan
的代码扫描工具,这个工具会自动的将本地构建的过程发送到指定的服务器端,并且由服务器端生成一个完整的报告。
4.2 操作上一章节的 Java 项目
- 如果要想使用这种扫描报告,只需要在程序编译的时候设置一些指令即可:
gradlew build --scan
- 当构建分析报告上传到服务器后,会给出一个服务器访问地址,可以通过这个地址查看报告信息。
- 开发人员和运维人员就可以依据此报告无缝沟通了。