创建自定义任务

打开build.gradle文件,并在末尾添加以下内容:

println "1" 

task howdy {
println "2"
doLast {
println "Howdy"
}
} println "3"

这将演示有关Gradle脚本如何工作的一些信息。使用以下命令运行它:

./gradlew howdy

您将看到(省略了一些多余的行):

> Configure project :
1
2
3 > Task :howdy
Howdy

在这里,Configure project任务将生成并运行生成脚本。在Gradle执行Configure project任务时,它会执行以下操作:

它打第一个println并打印“1”

它找到要执行的howdy任务定义块,一个闭包,并显示“2”。请注意,它不会执行doLast关闭操作,因此尚未打印“Howdy”。

它继续执行脚本,直到第四个println,然后打印“3”。

至此,构建脚本本身已完成对构建环境的配置。下一步是执行命令行中指定的所有任务,在本例中为howdy任务。

这是task.doLast{}执行块的地方,因此您会在输出中看到“Howdy”字样。

doLast是该块的别称;它的真正含义是类似于“任务操作”,而外部块是任务配置。

task howdy {
// 始终在初始构建脚本配置期间执行
doLast {
// 仅在任务本身被调用时执行
}
// 始终在初始构建脚本配置期间执行
}

使用Graovy DSL根据Gradle文档定义任务的各种方法如下:

task taskName
task taskName { configure closure }
task taskName(type: SomeType)
task taskName(type: SomeType) { configure closure }

只是为了锤炼,在运行构建脚本时立即执行“配置闭包”,而在doLast专门执行任务时执行在配置闭包中定义的闭包。

将第二个自定义任务添加到build.gradle文件:

task partner {
println "4"
doLast {
println "Partner"
}
}
println "5"

如果您./gradlew partner看到的是:

> Configure project :
1
2
3
4
5 > Task :partner
Partner

如果您希望一个自定义任务依赖另一个任务怎么办?这简单。build.gradle 在定义两个自定义任务之后,将以下行添加到文件中的某处。

partner.dependsOn howdy

并运行:./gradlew partner

...
> Task :howdy
Howdy > Task :partner
Partner

您也可以使用task属性表示类似的关系finalizedBy。如果将dependsOn行替换为:

howdy.finalizedBy partner

并运行:/gradlew howdy

...
> Task :howdy
Howdy > Task :partner
Partner

您得到相同的输出。当然,他们表达不同的关系。

关于任务的最后一点:在实践中,您很少编写自定义任务来说诸如“Howdy Partner”之类的东西(我很难相信,我知道)。实际上,通常您会覆盖已经定义的任务类型。例如,Gradle定义了Copy一个将文件从一个位置复制到另一个位置的任务。

这是一个将文档复制到构建目标的示例:

task copyDocs(type: Copy) {
from 'src/main/doc'
into 'build/target/doc'
}

当您意识到build.gradle文件实际上是一个Groovy脚本时,就可以使用Groovy和Gradle的真正功能,如果需要,您可以执行任意代码来过滤和转换这些文件。

下面的任务转换每个副本文件并排除.DS_Store文件。DSL非常灵活。您可以使用from和多个块excludes,也可以执行诸如重命名文件或专门包含文件之类的操作。再次查看“复制”任务的文档以获取更完整的想法。

task copyDocs(type: Copy) {
from 'src/main/doc'
into 'build/target/doc'
eachFile { file ->
doSomething(file);
}
exclude '**/.DS_Store'
}

我在Gradle Jar或中最重视War的任务是负责打包.jar.war文件以进行最终分发的任务。像Copy任务一样,他们具有定制过程的非常开放的能力,这对于需要定制最终产品的项目可能是巨大的帮助。实际上,您可以使用Gradle DSL来完全控制打包过程的各个方面。

Spring Boot插件的bootJarbootWar任务继承自JarWar任务,因此它们包括所有配置选项,包括复制,过滤和修改文件的能力以及自定义清单的能力。

提高篇到此结束,大家要是有兴趣欢迎去Gradle官网查看API文档,非常有帮助。


技术类文章精选

非技术文章精选

Gradle+Groovy提高篇的更多相关文章

  1. Gradle+Groovy基础篇

    在Java项目中,有两个主要的构建系统:Gradle和Maven.构建系统主要管理潜在的复杂依赖关系并正确编译项目.还可以将已编译的项目以及所有资源和源文件打包到.war或.jar文件中.对于简单的构 ...

  2. Maven提高篇系列之(五)——处理依赖冲突

    这是一个Maven提高篇的系列,包含有以下文章: Maven提高篇系列之(一)——多模块 vs 继承 Maven提高篇系列之(二)——配置Plugin到某个Phase(以Selenium集成测试为例) ...

  3. Spring boot 提高篇

    Spring boot 提高篇 上篇文章介绍了Spring boot初级教程:构建微服务:Spring boot 入门篇,方便大家快速入门.了解实践Spring boot特性:本篇文章接着上篇内容继续 ...

  4. ROS Learning-028 (提高篇-006 A Mobile Base-04) 控制移动平台 --- (Python编程)控制虚拟机器人的移动(不精确的制定目标位置)

    ROS 提高篇 之 A Mobile Base-04 - 控制移动平台 - (Python编程)控制虚拟机器人的移动(不精确的制定目标位置) 我使用的虚拟机软件:VMware Workstation ...

  5. Java提高篇——对象克隆(复制)

    假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short, ...

  6. Java提高篇(三三)-----Map总结

    在前面LZ详细介绍了HashMap.HashTable.TreeMap的实现方法,从数据结构.实现原理.源码分析三个方面进行阐述,对这个三个类应该有了比较清晰的了解,下面LZ就Map做一个简单的总结. ...

  7. Java提高篇(三二)-----List总结

    前面LZ已经充分介绍了有关于List接口的大部分知识,如ArrayList.LinkedList.Vector.Stack,通过这几个知识点可以对List接口有了比较深的了解了.只有通过归纳总结的知识 ...

  8. Java提高篇(三一)-----Stack

    在Java中Stack类表示后进先出(LIFO)的对象堆栈.栈是一种非常常见的数据结构,它采用典型的先进后出的操作方式完成的.每一个栈都包含一个栈顶,每次出栈是将栈顶的数据取出,如下: Stack通过 ...

  9. java提高篇(三十)-----Iterator

    迭代对于我们搞Java的来说绝对不陌生.我们常常使用JDK提供的迭代接口进行Java集合的迭代. Iterator iterator = list.iterator(); while(iterator ...

随机推荐

  1. 谷歌Chrome浏览器无法安装插件的解决方法(本文干货!)

    这个问题困扰了我很久,作为小白学习可能会用到谷歌插件,奈何谷歌也太变态,国内的环境无法正常登录谷歌账户.无法访问应用商店,而Chrome主版本号大于66的只能从Chrome应用商店下载并安装插件,各种 ...

  2. 在线WEB开发编辑器,edt.df5d.com

    在线WEB开发编辑器,http://edt.df5d.com 本地服务端下载 : https://pan.baidu.com/s/11SlcoU_D-KbzGFbs-_9Dpg 即可加载本地磁盘,也可 ...

  3. go中的数据结构切片-slice

    1.部分基本类型 go中的类型与c的相似,常用类型有一个特例:byte类型,即字节类型,长度为,默认值是0: bytes = []btye{'h', 'e', 'l', 'l', 'o'} 变量byt ...

  4. 基于 JavaFX 开发的聊天客户端 OIM-即时通讯

    OIM 详细介绍 一.简介 OIM是一套即时通讯的聊天系统,在这里献给大家,一方面希望能够帮助对即时通讯有兴趣研究的朋友,希望我们能够共同进步,另一个就是希望能够帮助到需要即时通讯系统的朋友或者企业, ...

  5. egret常用功能

    egret常用功能<pre>//////////////////////////////////////////////////////////////////////////////// ...

  6. 深入理解计算机系统 第八章 异常控制流 part2

    关于进程,需要关注其提供给应用程序的两个关键抽象: 1.一个独立的逻辑控制流,它提供一个假象,好像我们的程序独占地使用处理器 2.一个私有的地址空间,它提供一个假象,好像我们的程序独占地使用内存系统 ...

  7. python06-列表表达式、生成器表达式及其面试题、解耦简单介绍、函数递归相关

    目录: 一.列表推导式 二.生成器表达式 三.集合生成器 四.生成器面试题 五.解耦简单介绍 六.函数递归相关 一.列表推导式 需求:将[1,3,5]中的每个元素平方 正常思路: new_list = ...

  8. redis 底层数据结构

    简单动态字符串SDS 包含字符串长度,剩余可用长度,字符数组 用于Redis中所有的string存储 字典(map) 数组+链表形式,跟hashMap很像 链地址法解决hash冲突 rehash使用新 ...

  9. java编程思想第四版第八章习题

    第一题 package net.mindview.polymorphism; //基类-自行车 class Cycle{ } //子类-单轮车 class Unicycle extends Cycle ...

  10. 【SSM Spring 线程池 OJ】 使用Spring线程池ThreadPoolTaskExecutor

    最近做的Online Judge项目,在本地判题的实现过程中,遇到了一些问题,包括多线程,http通信等等.现在完整记录如下: OJ有一个业务是: 用户在前端敲好代码,按下提交按钮发送一个判题请求给后 ...