文档章节

使用Gradle编译Java工程之Task篇

shzwork
 shzwork
发布于 07/01 18:17
字数 1467
阅读 3
收藏 0

文章目的

通过本章的阅读,了解Gradle中的任务和工程的关系,以及任务的定义和如何使用,接下来让我们开始编写自己的任务代码进行工程打包操作吧。

需要准备

  • 一个熟悉的IDE开发工具
  • JDK 7及以上
  • Gradle 3.2以上

工程和任务的关系

在Gradle的世界中最重要的两个概念就是:工程(Project)和任务(Task)。
每一个Gradle的项目都会包含一个或多个工程,而每一个工程的职责又取决于我们对这个工程的定义,比如,一个工程可能是公共的JAR库,或者是一个WEB的应用程序,也可能是一个用于发布部署的ZIP包,而这个ZIP包又是通过其它工程编译打包的JAR文件组装成的。Gradle的编译思想跟maven一样, 也是约定优于配置,不过Gradle又比maven灵活,它为工程提供了很多具体的配置项。

每一个工程又由一个或多个任务组成,一个任务代表了一个工作的最小单元,它可以是一次类的编译、打一个JAR包、生成一份Javadoc或者是向仓库中提交一次版本发布。

接下来我们就一步步的了解如何定义和使用任务来实现不同的编译打包功能,我们会先在一个独立的工程中实现一些任务,然后再扩展到多个工程中去。

任务的定义和使用

当我们使用Gradle的命令时,比如gradle build,Gradle命令会去寻找当前目录下的build.gradle的文件,这个文件是Gradle的脚本文件,它里面定义了工程和工程拥有的所有任务等信息。

我们还是使用IDEA开发工具打开之前的HelloWorld项目工程,把之前build.gradle文件中所有的内容全部删除,开始今天的任务编写。
首先我们定义一个很简单的任务hello,其代码如下:

task hello {
    doLast {
        println 'Hello world!'
    }
}

然后打开命令行端终,执行命令:gradle -q hello,这时我们看到控制台成功的打印输出了:Hello world!',如下图:

图一 hello任务的结果

在以上代码中,我们定义了一个hello的任务,然后为它添加了一个动作(action),当执行gradle hello命令时,该命令会调用hello任务,然后执行它的动作,打印输出了Hello world!,这个动作是一个groovy的闭包函数。
如果大家对ant熟悉的话,可能会觉得Gradle的任务是不是和ant的相似?确定是的,不过Gradle的任务比ant的灵活方便很多,在Gradle中我们可以像写代码一样地实现很多ant很难实现的功能。

对于上面hello任务的定义,我们可以使用一种更简单便捷的方式实现。我们可以使用<<操作符来代替上面的doLast方法,如下:

task hello << {
    println 'Hello world!'
}

任务的依赖关系

我们可以定义一个任务依赖于某个其它的任务,比如一个发布(release)任务必须依赖编译(build)任务,代码如下:

task build {
    doLast {
        println "i'm build task"
    }
}
task release(dependsOn: build) {
    doLast {
        println "I'm release task"
    }
}

然后再执行gradle -q release,其输出结果如下:

图二 任务的依赖结果

对现有任务的操作

1,对现有的任务添加依赖关系

task build {
    doLast {
        println "i'm build task"
    }
}

task release() {
    doLast {
        println "I'm release task"
    }
}

// 添任务依赖关系
release.dependsOn build

其执行结果图二一样。

2,对现有的任务添加动作行为

task hello {
    doLast {
        println 'Hello World!'
    }
}

// 法方一,在doFirst动作中添加
hello.doFirst {
    println 'Hello doFirst'
}

// 法方二 在doLast动作中添加
hello.doLast {
    println 'Hello doLast1'
}

// 法方三 在doLast动作中添加
hello {
    doLast {
        println 'Hello doLast2'
    }
}

执行gradle -q hello其结果如下:

图三 添加动作行为结果

3,访问现有任务的属性值

task hello {
    doLast {
        println "Hello world! from the $hello.name task."
    }
}

执行gradle -q hello其结果如下:

图四 访问任务的名称

另外我们还可以为任务设置属性,主要通过ext.myProperty来初始化值,如下所示:

task myTask {
    ext.myProperty = "myValue"
}

task printTaskProperties {
    doLast {
        println myTask.myProperty
    }
}

其输出结果为:

> gradle -q printTaskProperties
myValue

4,在任务中调用groovy方法

task hello {
    doLast {
        int a = 1,b = 2;
        int result = add(a,b);
        println "a add b is = " + result;
    }
}

int add(int a,int b) {
    a + b;
}

执行gradle -q hello其结果如下:

图五 任务调用方法结果

总结

使用Gradle编译工程,其实就是在编译不同的任务,然后根据依赖关系组合执行,最后完成整个项目工程的打包发布。从工程和任务的关系,我们也能看到Gradle把“分而治之”思想运用得恰到好处,实现中我们一个项目可能包含若干个工程,这样使用Gradle就能很好的解决自动化地编译发布了。

请喜欢文章的同学关注我,有任何问题都在下方给我留言,我将会一一回复,我会把gradle的入门使用做成一系列的文章不断的发布。



作者:云时代构架杨彪
链接:https://www.jianshu.com/p/a7b947c86650
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

本文转载自:https://www.jianshu.com/p/a7b947c86650

shzwork
粉丝 15
博文 819
码字总数 10675
作品 0
厦门
私信 提问
读懂 Gradle 的 DSL

现在 Android 开发免不了要和 Gradle 打交道,所有的 Android 开发肯定都知道这么在 中添加依赖,或者添加配置批量打包,但是真正理解这些脚本的人恐怕很少。其实 Gradle 的 可以说是一个代码...

sw926
02/12
0
0
gradle/Groovy语法

Groovy官网的介绍(http://www.groovy-lang.org/download.html#gvm) Gradle API 文档: https://docs.gradle.org/current/dsl/org.gradle.api.invocation.Gradle.html 深入理解Android(一)......

shareus
2018/04/27
0
0
Gradle在实际开发中的用处

Gradle这门自动化构建技术出来的时间也不短了,越来越多知名的开源工程已经从原来的ant,maven等原始的构建迁移到了gradle中,例如:spring相关类库,android,java工程等等,有许多同学问我在...

qndroid
2018/07/04
0
0
翻译:Gradle之 Java插件

原文地址 http://www.gradle.org/docs/current/userguide/java_plugin.html 要使用Java插件,在脚本里加入: Example 23.1. Using the Java plugin Java插件引入了一个概念:源集(source se...

davelet
2014/02/14
0
0
用Gradle构建Spring Boot项目

相比起Maven的XML配置方式,Gradle提供了一套简明的DSL用于构建Java项目,使我们就像编写程序一样编写项目构建脚本。本文将从无到有创建一个用Gradle构建的Spring Boot项目,并在此过程中讲到...

asdf08442a
2018/09/28
73
0

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
9分钟前
1
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
3
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
12
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
13
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部