Gradle构建Java程序:Task

下列内容来自《Building and Testing with Gradle》。

Gradle运行生命周期如下:

  • Configuration phase: 运行configuration blocks
  • Execution phase:运行task actions

Task action定义

在Gradle中,task是build activity的基本单元,由一系列的构建指令组合而成。Task是first-class object。

Task Action使用task<<来定义:

1
2
3
task hello << {
println 'hello, world'
}

其中<<在此处表示为hello任务添加一系列的操作(append a code block to the list of actions a task performs)。

上述表达式可以用下面的命令来等价:

1
2
3
4
5
6
7
8
9
task hello

hello << {
print 'hello, '
}

hello << {
println 'world'
}

Task配置

Task的定义与配置很像,差别在于task配置中不使用<<

1
2
3
task initializeDatabase
initializeDatabase << { println 'task' }
initializeDatabase { println 'configuration}

上述第1条声明一个task,第2条添加operation到task,第3条是task的配置。

运行上述build文件,可以得到下列结果:

1
2
3
4
$ gradle -b scratch.gradle initializeDatabase
configuration
:initializeDatabase
task

Task是对象

Tasks are Objects。和不同的对象一样,a task object可以含有方法(methods)和属性(properties)。

前述定义的Task,属于DefaultTask,有以下一些方法。

dependsOn

被依赖的task会先执行。可以有不同的表示方法,结果是等效的。下面示例中定义的task依赖于两个其它task(只显示了4种方法):

1
task world(dependsOn: [compileTestClasses, createSchema])
1
2
task world
world.dependsOn compileTestClasses, createSchema
1
2
3
task world {
dependsOn compileTestClasses, createSchema
}
1
2
3
4
task world {
dependsOn << compileTestClasses
dependson << createSchema
}

doFirst

doFirst中的代码会在对应的task action之前执行;多个doFirst出现时,后出现的先运行,即遵照FILO规则。

1
2
3
4
5
6
7
task setupDatabaseTest << {
println 'load test data'
}

setupDatabaseTest.doFirst {
println 'create schea'
}
1
2
3
4
5
6
7
8
9
task setupDatabaseTest << {
println 'load test data'
}

setupDatabaseTest{
doFirst {
println 'create schea'
}
}

doLast

doLast中的代码会在对应的task action之后执行。多个doLast出现时,先出现的先运行,即遵照FIFO规则。doLast用法与doFirst类似。

1
2
3
4
5
6
7
task setupDatabaseTest << {
println 'create database schema'
}

setupDatabaseTest.doLast {
println 'load test data'
}

Task type

除了DefaultTask,task还有其它一些type。在task名字后面添加(type: typeName)即可指定task type。

Copy

Copy task从一个目录拷贝文件到另一个目录。

1
task copyFiles(type: Copy) {
  from 'resources'
  into 'target'
  include '**/*.xml', '**/*.txt', '**/*.properties'
}

Jar

从源文件生成jar文件

1
2
apply plugin: 'java'
task customJar(type: Jar) { manifest { attributes firstKey: 'firstValue', secondKey: 'secondValue' } archiveName = 'hello.jar' destinationDir = file("${buildDir}/jars") from sourceSets.main.classes }