首页 gradle概念扫盲
文章
取消

gradle概念扫盲

一. 基本概念

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 插件

1
apply plugin: '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'
       }
    }
}
本文由作者按照 CC BY 4.0 进行授权

UML建模

gradle