Java Gradle入门指南之简介、安装与任务管理
博客逐步迁移至 极客兔兔的小站
这是一篇Java Gradle入门级的随笔,主要介绍Gradle的安装与基本语法,这些内容是理解和创建build.gradle
的基础,关于Gradle各种插件的使用将会在其他随笔中介绍。
有什么疑问欢迎在文末关注留言,如果本文对你有用,那在右下角点个推荐吧~
1.Gradle简介与安装
1.1 简介
- Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。面向Java应用为主。
- Gradle支持多工程构建,提供强大的依赖管理,支持传递性依赖管理(无需配置XML);自动化Java开发中的编译、打包、执行测试案例等过程;同时Gradle支持丰富的插件,例如Java Web自动化部署的war、gretty插件等。
1.2 安装
- Windows:下载安装包,安装之后,将
GRADLE_HOME/bin
添加到环境变量。 - Linux:安装Gradle之后,配置
PATH
(1) 在~/.profile中加入GRADLE_HOME = YOUR_INSTALLATION_DIR
(2) 在~/.profile中加入PATH=$PATH:$GRADLE_HOME/bin
(3) 执行source ~/.profile重新加载profile文件
- 命令行下执行
gradle -v
可测试配置是否正确,更多命令行用法可执行gradle -h
。 - 本文代码测试版本为Gradle 2.11
2.任务(task)管理
一个脚本是一系列待执行操作(action)、属性的集合,有时,我们只想执行其中的某几个操作,那这几个操作及其相关的属性构成了一个任务(task),任务是gradle中的执行单元。比任务更大的是项目(project),往往包括多个任务。
2.1 创建第一个task
task hello << {
println "Hello World!" + project.name // => Test
// 或 println "Hello World!$project.name" // =>Test
}
- 在某个目录下(例如~/Test)新建文件build.gradle,文件内写入上述代码
- 切换到该目录,执行gradle hello,执行结果为Hello World!Test,若没有单独配置,项目名一般与当前文件夹名称相同。
- 执行这个脚本时,gradle调用org.gradle.api.Project创建一个实例project ,你可以用project.XX(在字符串中用$project.XX)去使用这个实例
- project有四个属性,name(只读),parent(只读),version,description
2.2 设置属性与任务执行
//已存在属性直接赋值即可
version = "1.0"
description = "I Am A Gradle Test!"
// 新增属性需要使用 ext
ext {
createDate = "Mar 2016"
}
ext.creator = "呆尐兔兔"
// task hello1
task hello1 {
doFirst {
// name为task的内置属性,值为task名称
println "1. My Name is " + name // ==> hello
println "2. I Belong To Project $project.name" //=>Test
}
doLast {
println "3. The Version Is " + project.version
println "4. I Am Created On " + project.createDate
}
}
// task hello2
task hello2 << {
ext { nickname = "excited"}
println "Step 2: $nickname" //=> excited
}
hello2.doFirst { println "Step 1" }
hello2.doLast { println "Step 3 " }
执行结果如下
C:\Users\gzd\Desktop\Test>gradle hello1 hello2
:hello1
1. My Name is hello1
2. I Belong To Project Test
3. The Version Is 1.0
4. I Am Created On Mar 2016
:hello2
Step 1
Step 2: excited
Step 3
- gradle [task1] [task2] [...],执行多个任务
- hello是Task对象一个实例,同样继承了一些属性,例如name、description等,可在task中使用ext新增属性
- doFirst和doLast方法为task内置方法,先后执行, << 操作符在Groovy中作用是添加元素,三者一起使用,顺序
doFirst
-><<
->doLast
。<< 常用来开速添加任务。
2.3 任务依赖
// 单任务依赖
// 该任务依赖的其他任务将先执行
task hello1 << {
println "Step 1"
}
task hello2(dependsOn:hello1) << {
println "Step 2"
}
// 等价于 task hello2 << { println "Step 2" }
// hello2.dependsOn hello1
// 多任务依赖
task hello2 << {
// ...
}
hello2.dependsOn hello1, hello3
// 等价于 task hello2(dependsOn: [hello1,hello3]) << { ... }
2.4 任务执行顺序与动态任务
task hello1 << {
println "Step 1"
}
task hello0 << {
println "Step 0"
}
task hello2(dependsOn:[hello1,hello0]) << {
println "Step 2"
}
task hello3 << {
println "Step 3"
}
以下是执行结果
C:\Users\gzd\Desktop\Test>gradle hello2 hello3
Step 0
Step 1
Step 2
Step 3
- 上述代码存在任务1,2,3,4,任务2依赖于任务1与任务0,执行gradle hello2 hello3,将依次执行任务0,1,2,最后执行3。
- 尽管任务1定义在任务0前面,依赖时顺序也是 1,0,对于依赖的任务,gradle的执行顺序按照
字母表
。 - gradle 提供了
shouldRunAfter
、mustRunAfter
、finalizedBy
三个选项帮助定义任务执行顺序。
// 使用groovy语法动态构建任务
(1..6).each {
task "hello$it" << {
println "Executing $name" //=>hello(1..6) 见2.2
}
}
hello1.dependsOn hello2
hello3.dependsOn hello2
hello5.finalizedBy hello6
hello5.mustRunAfter hello4
依次执行下列命令
gradle hello1 ==> 2->1
gradle hello1,hello3 ==> 2->1->3
gradle hello5 ==> 5->6
gradle hello5,hello4 ==> 4->5->6
- shouldRunAfter表示应该但不强制,mustRunAfter表示强制
// 考虑以下代码,执行gradle hello1将会报错
// 换为shouldRunAfter则不会报错,执行顺序为3->2->1
hello1.dependsOn hello2
hello2.dependsOn hello3
hello3.mustRunAfter hello1
- 另一个例子
// 以下代码将构建出hello0,hello1,hello2,hello3
// 下标从0开始
4.times { counter ->
task "hello$counter" << {
println "I'm $name" //=> hello[0..3]
}
}
- 使用addRule动态创建任务
// 以下代码将匹配以clean开头的任务
// 例如gradle cleanTest => Task is cleanTest
// gradle cleanHello => Task is cleanHello
tasks.addRule("Pattern:clean<fileName>") { String taskName ->
if(taskName.startsWith("clean")) {
task(taskName) << {
println "Task is $name";
}
}
}
2.5 任务名称简写
- gradle支持在执行命令时使用任务的简写(每个单词第一个字母)
- 例如执行gradle hello1, 可以简写为gradle h1
- 例如执行gradle helloWorld1,helloWorld2,可简写为gradle hW1,hW2
2.6 条件执行
2.6.1 onlyIf
// gradle hello => hello:SKIPPED(条件不满足,不执行)
// onlyIf 常用于判断当前环境是否满足执行条件
version = '1.0'
ext {
createYear = '2015'
}
task hello << {
println 'I was Created in ' + createYear
}
hello.onlyIf { project.hasProperty('createYear') &&
project.createYear == '2016'}
2.6.2 enabled
// gradle h2 => :hello1 SKIPPED :hello2 Step 2
// 即使2依赖1,1被禁用,2仍能执行
// 常用于测试,更换旧代码
task hello1 << {
println 'Step 1'
}
task hello2(dependsOn:hello1) << {
println 'Step 2'
}
hello1.enabled = false
- 由于
enabled
是task的一个属性,hello1 可以写为
task hello1 {
enabled = false;
doLast { println 'Step 1' }
}
2.7 编译优化
task hello {
ext {
testFile = file('in.txt')
}
String outFileName = 'out.txt'
File outFile = new File(outFileName)
inputs.file testFile
outputs.file outFile
doLast {
def property = new XmlParser().parse(testFile)
def key = property.key[0].text()
def value = property.value[0].text()
def destFile = new File(outFileName)
destFile.text = "$key = $value"
}
}
第一次执行
gradle hello => :hello BUILD SUCCESSFUL
第二次执行
gradle hello => :hello UP-TO-DATE
- gradle会自动对输入输出操作的task进行编译优化,例如上面的例子,第一次执行时,需要打开输入文件,创建输出文件,当第二次这个命令时,gradle发现输入输出文件并没有发生变化,因此显示UP-TO-DATE,即没有必要执行这个命令了,这在实际项目开发过程中,将节省大量的时间
- 当输入输出文件发生改变(例如删除out.txt),任务将重新编译执行
- 如果需要强制执行,及时输入输出没有发生改变,可以使用
--rerun-tasks
参数
gradle hello --rerun-tasks
// gradle -b build.gradle hello --rerun-tasks
Java Gradle入门指南之简介、安装与任务管理的更多相关文章
- Java Gradle入门指南之gretty插件(安装、命令与核心特性)
Java Web应用开发时常使用Gradle来进行项目管理,可以十分便利地解决包依赖等问题.war插件的出现,让项目部署成为一个复制粘贴的过程,那有没有办法让Java web应用的部署,就像w ...
- Java Gradle入门指南之内建与定制任务类(buildSrc、Groovy等)
上一篇随笔介绍了Gradle的安装与任务管理,这篇着重介绍Gradle的内建任务(in-built tasks)与自定义任务(custom tasks),借助Gradle提供的众多内建任务类型 ...
- Java Gradle入门指南之插件管理(类型、导入及java plugin使用)
上一篇随笔介绍了如何使用Gradle内建任务,介绍了自定义Gradle任务类的三种方法(build文件,buildSrc文件夹.新建groovy项目),一个任务是一个原子操作,即不可分割的.项 ...
- Java Gradle入门指南之依赖管理(添加依赖、仓库、版本冲突)
开发任何软件,如何管理依赖是一道绕不过去的坎,软件开发过程中,我们往往会使用这样那样的第三方库,这个时候,一个好的依赖管理就显得尤为重要了.作为一个自动构建工作,Gradle对依赖管理有着很好 ...
- 01Redis入门指南笔记(简介、安装、配置)
一:简介 Redis是一个开源的高性能key-value数据库.Redis是Remote DIctionary Server(远程字典服务器)的缩写,它以字典结构存储数据,并允许其他应用通过TCP协议 ...
- Java+7入门经典 -1 简介
第一章 Java简介 1.1 Java概览 applet程序可嵌入网页; Java会通过隐式检测禁止Java applet的恶意代码; Java Server Pages-JSP 创建服务器应用程序, ...
- java RMI入门指南
感觉这篇文章不错,直接转了 RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体如今它强大的开发分布式网络应用的能力上,是纯J ...
- Java RMI 入门指南
开通博客也有好些天了,一直没有时间静下心来写博文,今天我就把两年前整理的一篇关于JAVA RMI入门级文章贴出来,供有这方面需要的同学们参考学习. RMI 相关知识 RMI全称是Remote Meth ...
- 【HBase】HBase Getting Started(HBase 入门指南)
入门指南 1. 简介 Quickstart 会让你启动和运行一个单节点单机HBase. 2. 快速启动 – 单点HBase 这部分描述单节点单机HBase的配置.一个单例拥有所有的HBase守护线程- ...
随机推荐
- easyui combobox 值怎样获取
$('#com').combobox('getValue')获取当前选中的值$('#com').combobox('getText')获取当前选中的文字
- C#编程总结(十三)数据压缩
C#编程总结(十三)数据压缩 在进行文件存储或者数据传输时,为了节省空间流量,需要对数据或文件进行压缩.在这里我们讲述通过C#实现数据压缩. 一.GZipStream压缩 微软提供用于压缩和解压缩流的 ...
- 【Java每日一题】20161118
package Nov2016; public class Ques1118 { public static final int NUM = 10000000; public static void ...
- springmvc(1)DispatcherServlet源码简单解析
springmvc的简单配置 1.首先需要在web.xml中配置DispatcherServlet,这个类是springmvc的核心类,所以的操作都是由这里开始,并且大部分都是在这里面实现的,比如各种 ...
- java Servlet+mysql 调用带有输入参数和返回值的存储过程(原创)
这个数据访问的功能,我在.NET+Mysql .NET+Sqlserver PHP+Mysql上都实现过,并且都发布在了我博客园里面,因为我觉得这个功能实在是太重要,会让你少写很多SQL语句不说,还 ...
- 阿里社招B2B
岗位描述:1. 按USE CASE进行业务需求分析和软件概要设计2. 进行软件详细设计和编码实现,确保性能.质量和安全3. 维护和升级现有软件产品,快速定位并修复现有软件缺陷岗位要求:1. 精通Web ...
- Web应用网络模型
Web应用网络模型 前言 这篇文章要介绍的是一个常见Web应用基本的过程跟网络模型,当然,对于多数的Client/Server应用也是适用的.延续这个系列文章的风格,只管通俗不管严谨. 概览 总体模型 ...
- scope='request'的bean预加载冲突
Error creating bean with name 'authenticationSuccessServlet': Scope 'request' is not active for the ...
- 纯CSS3写的10个不同的酷炫图片遮罩层效果
这个是纯CSS3实现的的10个不同的酷炫图片遮罩层效果,可以欣赏一下 在线预览 下载地址 实例代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1 ...
- 简直要逆天!超炫的 HTML5 粒子效果进度条
我喜欢粒子效果作品,特别是那些能够应用于实际的,例如这个由 Jack Rugile 基于 HTML5 Cavnas 编写的进度条效果.看着这么炫的 Loading 效果,即使让我多等一会也无妨:)你呢 ...