一. 基本概念
1.1 projects和task
project是一个最小化的编译单元, 可以在编译时使用命令指定, gradle中所有的编译单元都是由一个个project组成,一个project可以是打包有一个jar, 打包一个网页, 编译文件等等。
task是project流水线的细化构成,每个project由一个个的task组成。
Maven中的任务都是和插件绑定的,需要添加定制一个新的任务的时候就需要封装一个新的插件。
Gradle中的任务除了在插件中预先封装, 还可以在构建脚本build.gradle中进行动态定义。
1.2 任务类型
1.2.1 静态任务
hello world
创建脚本build.gradle, 执行gradle -q hello
1
2
3
4
5
| task hello {
doLast {
println 'Hello world!'
}
}
|
1.2.2 动态任务
1
2
3
4
5
6
| 4.times { counter ->
task "task$counter" << {
println "I'm task number $counter"
}
}
|
1.3 任务关联
1.3.1 使用声明语法(dependson: hello)
1
2
3
4
5
6
7
| task hello << {
println 'Hello world!'
}
task intro(dependsOn: hello) << {
println "I'm Gradle"
}
|
1.3.2 使用api定义
1
2
3
4
5
6
| 4.times { counter ->
task "task$counter" << {
println "I'm task number $counter"
}
}
task0.dependsOn task2, task3
|
二. 任务行为
build.gradle
1
2
3
4
5
6
7
8
9
10
11
12
| task hello << { // 定义hello 任务
println 'Hello Earth'
}
hello.doFirst { // 先做
println 'Hello Venus'
}
hello.doLast { // 后做
println 'Hello Mars'
}
hello << { // 后做,<< 操作符是dolast的别称
println 'Hello Jupiter'
}
|
三. 任务属性
3.1 访问内置属性
1
2
3
4
5
6
| task hello << {
println 'Hello world!'
}
hello.doLast {
println "Greetings from the $hello.name task."
}
|
3.2 访问自定义属性
1
2
3
4
5
6
7
| task myTask {
ext.myProperty = "myValue"
}
task printTaskProperties << {
println myTask.myProperty
}
|
3.3 默认任务
1
2
3
4
5
6
7
8
9
10
11
12
13
| defaultTasks 'clean', 'run'
task clean << {
println 'Default Cleaning!'
}
task run << {
println 'Default Running!'
}
task other << {
println "I'm not a default task!"
}
|
四. java 插件
gradle中的插件和maven中的插件类似,maven中的对依赖和版本都是通过三维坐标确定的, 而gradle没有这个限定,gradle是全脚本代码完成, 所以也可以通过插件实现兼容maven中的那一套机制, 同时使用maven的插件库。gradle对比maven优秀的一点的是,maven的插件都是通过打jar包的形式,xml标签进行引用, 而gradle可以直接使用groovy脚本语言进行描述这些依赖和配置 。
使用java 插件
gradle的java插件是基于约定的, 就是java插件的一些默认的行为, 其实这些都是跟maven一样的, gradle的java插件可以看做是gradle对maven标准的实现兼容。java插件预置包含了一系列的任务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| > gradle build
:compileJava
:processResources
:classes
:jar
:assemble
:compileTestJava
:processTestResources
:testClasses
:test
:check
:build
BUILD SUCCESSFUL
Total time: 1 secs
|
五. 外部依赖
gradle使用外部依赖库, 可以像ant一样通过指定每个依赖包的下载地址, 也可以兼容像maven一样的中央仓库, 因为gradle的编译task都是脚本代码组成的,只要这个task去maven仓库下载了包回来, 并且做了解析, 那就可以直接使用maven仓库了, 这里的通用插件也是这么干的。
1
2
3
4
5
6
7
8
| repositories {
mavenCentral()
}
dependencies {
compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
testCompile group: 'junit', name: 'junit', version: '4.+'
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| apply plugin: 'java'
apply plugin: 'eclipse'
sourceCompatibility = 1.5 //自定义属性
version = '1.0'
jar { //插件中的方法调用
manifest {
attributes 'Implementation-Title': 'Gradle Quickstart', 'Implementation-Version': version
}
}
repositories { //使用maven仓库
mavenCentral()
}
dependencies { //依赖管理
compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
testCompile group: 'junit', name: 'junit', version: '4.+'
}
test { //测试
systemProperties 'property': 'value'
}
uploadArchives { //发布java文件
repositories {
flatDir {
dirs 'repos'
}
}
}
|