Gradle系列——Gradle测试,Gradle生命周期,settings.gradle说明,Gradle任务(基于Groovy文档4.0.4)day2-3

news/2024/5/20 1:15:37 标签: gradle, java

Gradle系列——Gradle测试,Gradle生命周期,settings.gradle说明,Gradle任务(基于Groovy文档4.0.4)day2-3

  • Gradle测试
    • 修改支持Junit 5测试
      • 1.打开build.gradle文件
      • 2.加上test
      • 3.刷新Gradle依赖
  • Gradle生命周期
  • settings.gradle说明
    • 单个项目构建的settings.gradle
    • 构建多工程
      • 1.创建父工程(father)
      • 2.构建子工程1(kid1)
      • 3.构建子工程(kid2)
      • 4.构建目录
      • 如上,我们发现一个项目只有一个settings
  • Gradle任务
    • 编写自定义Task
    • 执行Task
    • 任务行为doFirst和doLast
      • 外部定义实例
    • 任务行为说明
    • 默认任务
    • 任务之间的依赖关系
      • 参数依赖实例
      • 内部依赖
      • 外部依赖
      • 跨工程依赖
    • 任务执行
      • 各指令之间的依赖关系
    • 构建脚本任务的外部依赖项
    • 任务中使用属性
      • 任务分组
    • 任务的类型
      • 所有任务类型
    • 自定义任务类型
    • 任务的动态分配(通过times构建重复相似任务)
    • 任务的开启于关闭
    • 任务超时
      • 异常后继续执行
    • 任务查找
    • 任务的规则
    • 任务断言
    • 设置任务默认执行

Gradle测试

在我们执行gradle test命令后,gradle会将test文件夹下所有类进行测试并生成测试报告,支持JUnit 4,TestNG等测试
之前我们也说过,测试报告生成的位置是\build\reports\tests\test

修改支持Junit 5测试

gradle_5">1.打开build.gradle文件

在dependencies下加上

java">// https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.0'
// https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine
testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.9.0'

在这里插入图片描述

2.加上test

java">tasks.named('test') {
    useJUnitPlatform()
}

在这里插入图片描述

3.刷新Gradle依赖

Gradle生命周期

Gradle项目的生命周期分为:

  1. 初始化(initialization):Gradle 支持单项目和多项目构建。 在初始化阶段,Gradle 确定哪些项目将参与构建,并为每个项目创建一个 Project 实例。
  2. 配置(Configuration):在此阶段配置项目对象。 执行作为构建一部分的所有项目的构建脚本。
  3. 执行(Execution):Gradle 确定在配置阶段创建和配置的要执行的任务子集。 该子集由传递给 gradle 命令和当前目录的任务名称参数确定。 Gradle 然后执行每个选定的任务。

在这里插入图片描述

gradle_32">settings.gradle说明

除了构建脚本文件,Gradle 还定义了一个设置文件。 设置文件由 Gradle 通过命名约定确定。 此文件的默认名称是 settings.gradle

作用:
主要是在项目初始化阶段确定一下引入哪些工程需要加入到项目构建中,为构建项目工程树做准备。
工程树:
gradle中有工程树的概念,类似于maven 中的project 与module。

设置文件在初始化阶段执行。 多项目构建必须在多项目层次结构的根项目中有一个 settings.gradle 文件。 这是必需的,因为设置文件定义了参与多项目构建的项目。 对于单项目构建,设置文件是可选的。 除了定义包含的项目外,您可能还需要将库添加到构建脚本类路径

gradle_43">单个项目构建的settings.gradle

java">settings.gradle

rootProject.name = 'basic'
println 'This is executed during the initialization phase.'

构建多工程

1.创建父工程(father)

在这里插入图片描述
在这里插入图片描述
设置好刷新一下项目

2.构建子工程1(kid1)

在这里插入图片描述

在这里插入图片描述

3.构建子工程(kid2)

4.构建目录

在这里插入图片描述

如上,我们发现一个项目只有一个settings

我们发现父工程有setting.gradle但是子模块中没有,而且我们构建时我们明显发现,子工程的构建速度快于父工程
并且你可以看到如下settings.gradle的文件

在这里插入图片描述
若工程没有在settings.gradle中使用include引入则表示并不会在项目构建中添加入工程树中,工程和其子工程可以使用隔开

Gradle任务

对于Gradle任务来说我们需要使用到build.gradle文件

项目实质上是Task对象的集合。一个Task表示一个逻辑上较为独立的执行过程,比如编译Java源代码,拷贝文件,打包Jar文件,甚至可以是执行一个系统命令。另外,一个Task可以读取和设置Project的Property 以完成特定的操作

我们可以使用groovy编写gradle中的task!

编写自定义Task

任务定义方式,总体分为两大类:一种是通过Project 中的task()方法.另一种是通过tasks对象的create()或者register()方法。

register是延迟创建的,即只有被需要使用的时候才会被创建

如下是自己编写的一个task任务

java">task("defineTask1"){
    //任务的配置在配置阶段执行
    println("this is a define task called task1")
    //任务的行为在执行阶段执行
    doFirst {
        println("define task1 : do first method")
    }
    doLast {
        println("define task1 : do last method")
    }
}

//或你也可以
tasks.register('defineTask1'){
}

//或你也可以
tasks.create('defineTask1'){
}

在这里插入图片描述

执行Task

我们使用gradle -i + task名即可执行

java">gradle -i defineTask1

我们来看一下输出

在这里插入图片描述
在这里插入图片描述

任务行为doFirst和doLast

既可在内部进行定义也可以在任务的外部进行定义

外部定义实例

java">task("defineTask1") {
    //任务的配置在配置阶段执行
    println("this is a define task called task1")
    //任务的行为在执行阶段执行
}

defineTask1.doFirst(){
    println("这是doFirst的外部定义")
}

defineTask1.doLast(){
    println("这是doLast的外部定义")
}

在这里插入图片描述

任务行为说明

无论是定义任务自身的action,还是添加的doLast.doFirst.方法,其实底层都被放入到一个Action 的List中了,最初这个action List是空的,当我们设置了action【任务自身的行为】.它先将action添加到列表中,此时列表中只有一个action,后续执行doFirst的时候doEirst在action前面添加, 执行doLast.的时候doLast.在action后面添加。 doFirs.永远添加在actions List的第一位,保证添加的Action在现有的action List元素的最前面; do.Last,永远都是在action List末尾添加,保证其添加的Action 在现有的action List元素的最后面。一个往前面添加,一个往后面添加,最后这个actionList 就按顺序形成了doFirst、doSelf、doLast.三部分的Actions,就达到doFirst、doSelf、doLast,三部分的Action顺序执行的目的。

默认任务

Gradle 允许您定义一个或多个在未指定其他任务时执行的默认任务

java">

defaultTasks 'clean', 'run'

tasks.register('clean') {
    doLast {
        println 'Default Cleaning!'
    }
}

tasks.register('run') {
    doLast {
        println 'Default Running!'
    }
}

tasks.register('other') {
    doLast {
        println "I'm not a default task!"
    }
}

任务之间的依赖关系

当一个任务依赖多个任务时,若被依赖的任务没有依赖关系,则执行顺序随机,重复依赖的任务只执行一次
其中依赖分为:

  1. 参数依赖
  2. 内部依赖
  3. 外部依赖

参数依赖实例

java">task("define1"){
    println("这是define1")
    doFirst{
        println("define1 do first")
    }
}

task ("define2"){
    println("这是define2")
    doFirst{
        println("define2 do first")
    }
}


task define3 (dependsOn:[define1,define2]){
    println("======define3=====")
}

内部依赖

java">//或你也可以这样写
task define3 (){
	dependsOn=[define1,define2]
    println("======define3=====")
}

外部依赖

java">//或你也可以
task define3 (){
    println("======define3=====")
}

define3.dependsOn=[define1,define2]

跨工程依赖

依赖子项目kid1中的kdefine1

java">task define3 (){
	dependsOn(":kid1:kdefine1")
    println("======define3=====")
}

任务执行

语法gradle + 任务名 + 参数

分类说明
常见的任务(*)gradle build: 构建项目:编译、测试、打包等操作
gradle run:运行一个服务,需要application插件支持,并且指定了主启动类才能运行gradle clean:请空当前项目的build目录
gradle init:初始化gxadle.项目使用
gradle wrapper:生成 wrapper文件夹的。
gradle wrapper:升级wrapper版本号,如 gradle wrapper --gradle.xersion=4.4
项目报告相关任务gradle projects: 列出所选项目及子项目列表,以层次结构的形式显示
gradle tasks:列出所选项目【当前project,不包含父、子】的已分配给任务组的那些任务。需要使用group指定组
gradle tasks --all:列出所选项目的所有任务。
gradle tasks --group=“build setup”:列出所选项目中指定分组中的任务。
gradle help --task someTask :显示某个任务的详细信息
gradle dependencies :查看整个项目的依赖信息,以依赖树的方式显示
gradle properties:列出所选项目的属性列表
调试相关选项-h,–help:查看帮助信息
-V, --version:打印 Gradle、Groovy、Ant、JVM 和操作系统版本信息。
-S, --full-stacktrace:打印出所有异常的完整(非常详细)堆栈跟踪信息。
-s,–stacktace:打印出用户异常的堆栈跟踪(例如编译错误)。
-Dorg.gradle,daemon.debug=true:调试 Gradle守护进程。
-Dorg.gradle.debug=true:调试 Gradle客户端(非daemon)进程。
-Dorg.gradle.debug.port=(port number):指定启用调试时要侦听的端口号。默认值为5005.
性能选项:【备注:在guadle.properties 中指定这些选项中的许多选项,因此不需要命令行标志】–build-cache, --no-build-cache:尝试重用先前版本的输出。默认关闭(off)。
–tax-workers:设置 Gradle可以使用的woker数。默认值是处理器数。
-parallel, --no-parallel:并行执行项目。有关此选项的限制,请参阅并行项目执行。
默认设置为关闭(off)
守护进程选项–daemon, --no-daemon:使用Gradle守护进程运行构建。默认是on
–foreground:在前台进程中启动 Gradle守护进程。
-Dorg.gradle.daemon.idletimeout=(number of milliseconds):Gradle Daemon将在这个空闲时间的毫秒数之后停止自己。默认值为108o00oo(3小时)。
日志选项-Dorg.gradle,logging.level=(quiet,warn,lifecxcle,info,debug);通过Gradle属性设置日志记录级别。
-q,–quiet:只能记录错误信息
-w,–warn:设置日志级别为warn-i, --info:将日志级别设置为info
-d, --debug:登录调试模式(包括正常的堆栈跟踪)
其他-x:-x等价于: --exclude-task:常见gxadle,-x test clean build
–rerun-tasks:强制执行任务,忽略up-to-date ,常见gxadle build --rerun-tasks
–continue:忽略前面失败的任务,继续执行,而不是在遇到第一个失败时立即停止执行。每个遇到的故障都将在构建结束时报告,常见: gradle build --continue。
gradle. init --type pom:将maven项目转换为gradle项目(根目录执行)
gradle [taskName]:执行自定义任务

各指令之间的依赖关系

在这里插入图片描述

在这里插入图片描述

构建脚本任务的外部依赖项

如果您的构建脚本需要使用外部库,您可以将它们添加到构建脚本本身的脚本类路径中。 您可以使用 buildscript()方法,传入一个声明构建脚本类路径的块

java">buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath group: 'commons-codec', name: 'commons-codec', version: '1.2'
    }
}

传递给 buildscript() 方法的块配置了一个 ScriptHandler 实例。 您可以通过将依赖项添加到类路径配置来声明构建脚本类路径。 这与声明 Java 编译类路径的方式相同。 您可以使用除项目依赖项之外的任何依赖项类型。

声明了构建脚本类路径后,您可以像使用类路径上的任何其他类一样使用构建脚本中的类。 以下示例添加到前面的示例,并使用构建脚本类路径中的类。

java">import org.apache.commons.codec.binary.Base64

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath group: 'commons-codec', name: 'commons-codec', version: '1.2'
    }
}

tasks.register('encode') {
    doLast {
        def byte[] encodedString = new Base64().encode('hello world\n'.getBytes())
        println new String(encodedString)
    }
}

任务中使用属性

属性说明默认值
type基于一个存在的Task 来创建,和我们类继承差不多DefaultTask
overwrite是否替换存在的Task,这个和 type配合起来用false
dependsOn用于配置任务的依赖[ ]
action添加到任务中的一个Action或者一个闭包null
description用于配置任务的描述null
group用于配置任务的分组null

任务分组

java">task(group:"defineGroup",description:"define for myself")

task defineTest(){
	group("defineGroup")
}

任务的类型

参考地址
task默认是DefaultTask类型的,当然也可以有其他类型帮助我们做一些处理
以下是常用任务类型:

类型说明
Delete删除文件或目录
Copy将文件复制到目标目录中。此任务还可以在复制时重命名和筛选文件。
CreateStartScripts创建启动脚本
Exec执行命令行进程
GenerateMaxenPom生成Maven模块描述符(POM)文件。
GradleBuild执行Gradle构建
Jar组装JAR 归档文件
JavaCompile编译Java源文件
Javadoc为Java类生成HTMI API文档
PublishToMavenRepository将MavenPublication发布到mavenartifactrepostal。
Tar组装TAR存档文件
Upload将Configuration的构件上传到—组存储库。
Test执行JUnit (3.8.x、4.x或5.x)或工estNG测试。
War组装WAR档案。
Zip组装ZIP归档文件。默认是压缩ZIP的内容。

所有任务类型

  1. AntlrTask
  2. BuildEnvironmentReportTask
  3. Checkstyle
  4. CodeNarc
  5. Copy
  6. CreateStartScripts
  7. Delete
  8. Ear
  9. Exec
  10. GenerateIvyDescriptor
  11. GenerateMavenPom
  12. GenerateBuildDashboard
  13. GradleBuild
  14. GroovyCompile
  15. Groovydoc
  16. HtmlDependencyReportTask
  17. JacocoReport
  18. JacocoMerge
  19. JacocoCoverageVerification
  20. Jar
  21. JavaCompile
  22. Javadoc
  23. JavaExec
  24. Pmd
  25. PublishToIvyRepository
  26. PublishToMavenRepository
  27. ScalaCompile
  28. ScalaDoc
  29. InitBuild
  30. Sign
  31. Sync
  32. Tar
  33. AbstractTestTask
  34. Test
  35. TestReport
  36. Upload
  37. War
  38. Wrapper
  39. WriteProperties
  40. Zip

实例请见官网,实在是太多了

自定义任务类型

除了官网给定的我们还可以自定义任务类型,我们首先需要继承DefaultTask这个类,定义任务时使用type属性传入使用即可

java">class DefineTaskType extends DefaultTask{
	@TaskAction //表示Task要执行的方法
	def doTask(){
		....
	}
}

task defineTask(type:DefineTaskType){
	....
}

任务的动态分配(通过times构建重复相似任务)

我们可以使用times方法构建相似的重复的大量任务,只需要指定数量即可

java">100.times{ counter -> 
	tasks.register("define$counterTask"){
		doFirst{
			println("$counter task define !")
		}
	}
}

如上所示,这样就构建了100个任务了
后面我们可以通过如下方式进行动态分配依赖

java">tasks.named("define1counterTask"){
	//进行分配
	dependsOn("define2counterTask","define4counterTask")
}

任务的开启于关闭

我们可以使用enabled方法标记任务为开启或关闭的(true表示开启,false表关闭),默认false

java">task defineTask(){
	enabled(false)
}

任务超时

使用timeout指定超时时长,超出时长则视为执行失败,默认单位为毫秒ms,失败后报出异常,后续任务无法继续执行

java">task defineTask(){
	timeout = Duration.ofMillis(1000)
}

异常后继续执行

为避免异常后其他任务不执行的问题,我们可以使用-continue参数使得在出现异常后后续任务继续执行

如下,执行2个任务,当任务defineTask1异常后defineTask2继续执行

java">gradle defineTask1 defineTask2 -continue

任务查找

当我们希望找一个任务的时候我们可以使用tasks.findByName方法通过任务名进行查找,或使用task.findByPath方法通过任务地址查找,查找到后可以直接使用方法,因为返回值就是你要查找的任务

java">tasks.findByName("defineTask1").doLast({
	....
})

任务的规则

当我们执行、依赖一个不存在的任务时,Gradle会执行失败,报错误信息。那我们能否对其进行改进,当执行一个不存在的任务时,不是报错而是打印提示信息呢?
其实是可以的
我们只需要使用tasks.addRule方法设置任务的规则

java">tasks.addRule("说明:。。。。"){
	taskName -> task(taskName){
		println("$taskName is not exist!")
	}
}

这样即使任务不存在也不影响其他任务执行

任务断言

断言就是一个条件表达式。Task有一个onlylf方法。它接受一个闭包作为参数,如果该闭包返回true则该任务执行,否则跳过。这有很多用途,比如控制程序哪些情况下打什么包,什么时候执行单元测试,什么情况下执行单元测试的时候不执行网络测试等。

我们使用任务名.onlyIf{条件}即可

java">task defineTask{
	...
}

defineTask.onlyIf{
	...
}

当不满足onlyIf中的条件时,该任务不执行

设置任务默认执行

当我们使用某些指令的时候设置一个任务的自动执行
我们可以使用defaultTasks(任务名),其中传入的参数可以使用不定长String,也可以使用List

java">defaultTasks("defineTask1","defineTask2")

http://www.niftyadmin.cn/n/1717125.html

相关文章

去除List集合中的重复值

最近项目中需要对list集合中的重复值进行处理,大部分是采用两种方法,一种是用遍历list集合判断后赋给另一个list集合,一种是用赋给set集合再返回给list集合。 但是赋给set集合后,由于set集合是无序的,原先的顺序就打乱…

Linux下打包压缩war、解压war包和jar命令

Linux下打包压缩war、解压war包和jar命令 解决 把project_a文件夹下的文件打包成project.war 1. 打包 jar -cvf project.war /project_a -c 创建war包 -v 显示过程信息 -f 指定 JAR 文件名,通常这个参数是必须的 -M 不产生所有项的清单(MANIFES…

linux 下 tar 命令

tar -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。下面的参数是根据…

Linux下rz命令和sz命令使用方法

sz命令 用途说明:sz命令是利用ZModem协议来从Linux服务器传送文件到本地,一次可以传送一个或多个文件。相对应的从本地上传文件到Linux服务器,可以使用rz命令。 常用参数 -a 以文本方式传输(ascii)。 -b 以二进制方…

Linux下wget命令使用方法

Wget 的以一款方便的使用HTTP协议进行文件抓取的工具,在linux下面比较常用,支持以下功能: 1)支持断点下传功能 2)同时支持FTP和HTTP下载方式 3)支持代理服务器 4)设置方便简单; 5&am…

MySQL添加字段,修改字段,删除字段,修改表信息

MySql的简单语法,常用,却不容易记住。当然,这些Sql语法在各数据库中基本通用。下面列出: 一:查询信息 1.登录数据库 >mysql -u root -p 数据库名称 2.查询所有数据表 >show tables; 3.查询表的字段信息 >…

Linux下history命令用法

如果你经常使用 Linux 命令行,那么使用 history(历史)命令可以有效地提升你的效率。本文将通过实例的方式向你介绍 history 命令的 15 个用法。 使用 HISTTIMEFORMAT 显示时间戳 当你从命令行执行 history 命令后,通常只会显示已…

linux 下 vi 文本编辑如何复制一行粘贴删除一行数据

在使用vi有时会想直接复制一行数据,然后粘贴一行或者直接删除一行数据 复制一行数据的方法 把光标放到要复制的一行前面,然后按两下yy字母键 然后把光标放到要复制到的地方去,按键盘的p字母键 删除一行是把光标移动到要删除的一行上&#xff…