Java Gradle入门指南之内建与定制任务类(buildSrc、Groovy等)
博客逐步迁移至 极客兔兔的小站
上一篇随笔介绍了Gradle的安装与任务管理,这篇着重介绍Gradle的内建任务(in-built tasks)与自定义任务(custom tasks),借助Gradle提供的众多内建任务类型以及自己定制的任务类型,Java Web、Android等的开发、测试、部署将会变得非常容易。这篇随笔提供的都是非常简单的示例,但这对于读懂Gradle脚本(例如常见的build.gradle)或者是书写Gradle脚本相信是有帮助的。本文所有代码测试环境为Gradle 2.11
如有错误,请不吝指出,非常感谢;如本文对您有帮助,右下角点个推荐吧~
1.内建任务类(in-built tasks)
Gradle在不断地更新,其内建任务也在不断地丰富,这一章节介绍Gradle中最常用的几个内建任务类,这只是Gradle众多内建任务类中的一部分,抛砖引玉,更多方法可以参见Gradle官方文档
1.1 复制(Copy)
项目开发和部署过程中,复制文件是很常见的工作,gradle为了简化开发步骤提供了大量的内建任务类,Copy便是其中之一
- 先看一段最简单的代码
// org.gradle.api.tasks.Copy
// 将in.txt从当前文件夹复制到abc文件夹(不存在则新建)
// 代码中的路径为相对路径
task copyTask(type: Copy) {
from '.'
into 'abc'
include 'in.txt'
}
- include 与 exclude
(1) include '*' => 包含所有的文件以及文件夹
(2) include/exclude '*.xml' => 包含/排除当前文件夹下xml类型文件
(3) include/exclude '*.txt','*.data' =>包含/排除多类文件,逗号隔开
(4) include/exclude '**/*.xml' => 包含/排除所有文件夹下xml类型文件
- with
// 定义一个copySpec,通常是重复使用的语句
// 插入到Task中
def dataContent = copySpec {
from 'src'
include '*.data'
}
task copyTask(type: Copy) {
from('.') {
exclude '*.txt', '*.xml' //排除txt、xml类型的文件
}
into 'build'
include '*'
includeEmptyDirs = false
with dataContent
}
- 其他属性
(1) caseSensitive => 大小写敏感,true/false,默认为true
(2) includeEmptyDirs => 是否包含空文件夹,true/false,默认为true
(3) filter => 重用org.apache.tools.ant.filters.*的方法
(4) 更多参见官方文档
1.2 重命名(Rename)
- 闭包方法
// rename(Closure closure)
// 执行gradle cT
// 将当前文件夹下的所有.txt文件复制到build/中,并将后缀改为.data
task copyTask(type: Copy) {
from '.'
into 'build'
include '*.txt'
rename { String fileName ->
fileName.replace('.txt' , '.data')
}
}
- 正则表达式
// rename(String sourceRegEx, String replaceWith)
// 将所有以out开头的文件复制到build/,并将out替换为output
// $指代正则表达式匹配的地方,从1开始
task copyTask(type: Copy) {
from '.'
into 'build'
include '*.txt'
rename 'out(.*)', 'output$1' //=> out.txt->output.txt
// rename '(.*)t(.*)', '$1output$2'
}
>> 原来的结构如下
--Test/
|--out.txt
|--build.gradle
>> 执行任务后结构
--Test/
|--build/
|--output.txt
|--out.txt
|--build.gradle
1.3 打包(Zip)
// 执行gradle zT
// 将src文件夹下所有文件打包到dest/文件夹下
task zipTask(type: Zip) {
File destDir = file('dest')
archiveName 'abc.zip'
from 'src'
destinationDir destDir
}
>> 原来的结构如下
--Test/
|--src/
|--hello.java
|--world.java
|--build.gradle
>> 执行任务后结构
--Test/
|--dest/
|--abc.zip // 解压后为hello.java和world.java2个文件
|--src/
|--hello.java
|--world.java
|--build.gradle
1.4 删除(delete)
项目打包时,往往需要删除调试、测试时的临时文件,例如输出、日志等,可以使用内建方法Delete完成这个任务,使用也非常简单
task deleteTask(type: Delete) {
delete 'out.txt','log.txt'
}
1.5 执行(Exec)
每次执行时,都要切换环境,敲入命令,gradle提供了Exec内建方法去简化调试、测试过程,可以根据需要编写代码
// Java Web开发,关闭Tomcat
task stopTomcat(type:Exec) {
workingDir '../tomcat/bin'
//linux下
commandLine './stop.sh'
// 重定向输出到扩展属性output,而不是控制台
// 当然可以改为输出到文件
standardOutput = new ByteArrayOutputStream()
ext.output = {
return standardOutput.toString()
}
}
- 其他属性
(1) args(args) =>命令参数,List <String>
(2) commandLine(args) =>命令,List <String>
(3) environment(name, value),=> 临时添加一个环境变量,多个需Map
(4) workingDir(dir) => 工作目录,file类型
(5) 更多参见官方文档
2.定制任务(custom tasks)
Gradle支持大量的插件,例如war、java、gretty等,这些插件能够自动化自动化编译、打包等过程,但是有时由于项目需求,插件并不能满足项目的需求,Gradle支持定制任务类去完成你的工作。接下来将介绍三种定制Gradle任务类的方法
2.1 创建build文件
// .../Test/build.gradle
println 'I Am A Custom Task'
class HelloTask extends DefaultTask {
String nickName = 'default'
@TaskAction
def action1() { println 'Step 3 I Am ' + name }
@TaskAction
def action2() { println 'Step 2 NickName Is ' + nickName }
}
task hello(type: HelloTask) {
nickName = 'gzdaijie'
doFirst { println 'Step 1' }
doLast { println 'Step 4' }
}
执行结果
C:\Users\gzd\Desktop\Test>gradle -q hello
I Am A Custom Task
Step 1
Step 2 NickName Is gzdaijie
Step 3 I Am hello
Step 4
- name是内置属性,值为任务名称,doFirst,doLast内置方法
- 扩展自类
DefaultTask,@TaskAction新增Action - 关于Task基础知识的介绍,可以参考我的上一篇博客
2.2 创建buildSrc目录
事实上,build.gradle文件中不适合写类的定义,假设我们定制的每个Task类都写在build.gradle中,那么build.gradle文件将会变得很大,可读性大大降低,但是又不想为此单独创建一个工程,那么将代码写在buildSrc文件夹中将是一个很好的选择。
// 文件 HelloTask.groovy
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
class HelloTask extends DefaultTask {
String nickName = 'default'
@TaskAction
def action1() { println 'Step 3 I Am ' + name }
@TaskAction
def action2() { println 'Step 2 NickName Is ' + nickName }
}
// 文件 build.gradle
task hello(type: HelloTask) {
nickName = 'gzdaijie'
doFirst { println 'Step 1' }
doLast { println 'Step 4' }
}
新建文件 buildSrc/src/main/groovy/ch3/HelloTask.groovy
目录结构如下
---Test/
|--build.gradle
|--buildSrc/
|--src/
|--main/
|--groovy/
|--ch3/
|--HelloTask.groovy
执行gradle -q hello
结果与2.1一致,build.gradle中的代码显得十分干净
2.3 创建独立的groovy项目
新建一个groovy项目,命名为HelloTask,可以使用eclipse、IDEA等IDE,接下来纯手工建项目吧~
- 新建文件~/HelloTask/src/main/groovy/HelloTask.groovy,将之前的HelloTask复制进去,然后在HelloTask/目录下新建文件build.gradle,这里我们同样使用gradle来构建groovy项目。
// => HelloTask/build.gradle
// apply plugin 应用插件
apply plugin: 'groovy'
version=1.0
dependencies {
// 添加依赖
compile gradleApi()
compile localGroovy()
}
目录结构如下
--HomeDir
|--Test
|--build.gradle
|--HelloTask
|--build.gradle
|--src
|--main
|--groovy
|--HelloTask.groovy
在HelloTask/ 下执行gradle build
你会发现该目录下多了build/libs/HelloTask-1.0.jar
这就是我们编译好的定制任务类
- 接下来在HelloTask/ 下执行
gradle build,gradle会在src/main/groovy目录下搜寻所有的类build - 回到Test/目录,清空所有内容,只留下build.gradle,写入以下内容
// => Test/build.gradle
// buildscript 配置导入路径,包信息
buildscript {
repositories {
flatDir { dirs '../HelloTask/build/libs' }
}
dependencies { classpath group: 'ch3', name:'HelloTask',version:'1.0' }
}
task hello(type: HelloTask) {
nickName = 'gzdaijie'
doFirst { println 'Step 1' }
doLast { println 'Step 4' }
}
- 在Test/ 中执行gradle hello,效果和2.1、2.2完全一致
3.小结
1中介绍了常用的内建Task类,2.3中使用了Gradle创建了Groovy项目,并用了buildscript导入了编译好的包,入门指南写到这里,build.gradle已经很接近使用IDE(例如Eclipse、IDEA、Andriod Studio)自动生成的build.gradle文件了,Gradle依赖管理的威力已经开始显现。
实际项目开发中,更多地是导入maven仓库,而不是自己写依赖,但是希望这个指南能给希望了解Gradle的博友带来帮助,喜欢就关注一下吧~
Java Gradle入门指南之内建与定制任务类(buildSrc、Groovy等)的更多相关文章
- Java Gradle入门指南之插件管理(类型、导入及java plugin使用)
上一篇随笔介绍了如何使用Gradle内建任务,介绍了自定义Gradle任务类的三种方法(build文件,buildSrc文件夹.新建groovy项目),一个任务是一个原子操作,即不可分割的.项 ...
- Java Gradle入门指南之依赖管理(添加依赖、仓库、版本冲突)
开发任何软件,如何管理依赖是一道绕不过去的坎,软件开发过程中,我们往往会使用这样那样的第三方库,这个时候,一个好的依赖管理就显得尤为重要了.作为一个自动构建工作,Gradle对依赖管理有着很好 ...
- Java Gradle入门指南之简介、安装与任务管理
这是一篇Java Gradle入门级的随笔,主要介绍Gradle的安装与基本语法,这些内容是理解和创建build.gradle的基础,关于Gradle各种插件的使用将会在其他随笔中介绍. ...
- Java Gradle入门指南之gretty插件(安装、命令与核心特性)
Java Web应用开发时常使用Gradle来进行项目管理,可以十分便利地解决包依赖等问题.war插件的出现,让项目部署成为一个复制粘贴的过程,那有没有办法让Java web应用的部署,就像w ...
- java RMI入门指南
感觉这篇文章不错,直接转了 RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体如今它强大的开发分布式网络应用的能力上,是纯J ...
- Java RMI 入门指南
开通博客也有好些天了,一直没有时间静下心来写博文,今天我就把两年前整理的一篇关于JAVA RMI入门级文章贴出来,供有这方面需要的同学们参考学习. RMI 相关知识 RMI全称是Remote Meth ...
- java从入门到卖肠粉系列
java从入门到卖肠粉系列 注:本教程只是从JAVA基础开始,绝对不会跟公司有任何利益冲突,更不会出现一行公司项目的代码 QQ群:9547527 推荐用土豆,百度去上传太慢,百度云在线播放还要转码.. ...
- Java程序员的Golang入门指南(上)
Java程序员的Golang入门指南 1.序言 Golang作为一门出身名门望族的编程语言新星,像豆瓣的Redis平台Codis.类Evernote的云笔记leanote等. 1.1 为什么要学习 如 ...
- Gradle用户指南(章9:Groovy快速入门)
Gradle用户指南(章9:Groovy快速入门) 你可以使用groovy插件来构建groovy项目.这个插件继承了java插件的功能,且扩展了groovy编译.你的项目可以包含groovy代码.ja ...
随机推荐
- FireMonkey ListView 自动计算行高
说明:展示 ListView 视其每一行 Item 的 Detail 字串长度自动调整高度(可每行高度不同). 适用:Delphi XE7 / XE8 源码下载:[原创]ListView_自动计算行高 ...
- Firemonkey 移动平台 Form 显示使用 ShowModal 范例
procedure TForm1.Button1Click(Sender: TObject); begin Form2 := TForm2.Create(Self); Form2.ShowModal( ...
- 百度地图自定义Marker
最近写了百度地图的Demo,所以总结下遇到的问题: 1.首先在百度地图中创建应用时用到 发布版SHA1是在Preferences下的Android下的Build中;2.在使用百度地图时,先要创建一个A ...
- 容器--Map和AbstractMap
一.前言 前面我们介绍了Collection接口的定义及一系列实现,并重点介绍了List体系下的一些实现,对于Collection来说,其实还有Set系列同样很重要,但由于Set是依赖于Map实现的, ...
- wso2esb简介
WSO2 ESB是一个轻量级的易于使用的企业服务资源总线,基于Apache Software License v2.0. WSO2 ESB 允许系统管理员和SOA架构师轻松的配置消息路由, 虚拟化, ...
- 手动创建VS单元测试,显示代码覆盖率
Visual Studio 号称有史以来最强大的IDE,确实如此.创建单元测试也是一键完成:在方法的代码块中右键“Create Unit Test…”,勾选测试项,填项目名,完成.VS就会自动帮你创建 ...
- textillate.js 文字动画
textillate.js是一款强大的文字插件,若配合animate.css.fittext.lettering一起使用,这样做出来的文字特效很完美. 在线实例 实例演示 使用方法 <div i ...
- imagesLoaded – 检测网页中的图片是否加载
imagesLoaded 是一个用于来检测网页中的图片是否载入完成的 JavaScript 工具库.支持回调的获取图片加载的进度,还可以绑定自定义事件.可以结合 jQuery.RequireJS 使用 ...
- Intense Images – 全屏浏览图像的 JS 插件
Intense Images 是一个独立的 JavaScript 库,用于查看全屏图像.使用触摸/鼠标来实现图片位置的平移.图像元素的所有样式都是可以自定义的,Intense.js 只处理图像浏览器和 ...
- 优秀案例:12个精美的设计工作室 & 设计公司网站
如果你正在为自己的作品集网站设计寻找灵感,那么学习设计机构 & 设计公司的网站是如何制作的是一个良好的开端.在这篇稳重,我们已经聚集了一组设计机构的优秀作品集网站,你可以借鉴很多设计理念.当你 ...