Gradle教程(二)

Gradle:Project,Tasks and Plugins

让我们回忆上一节,在此基础上增加点东西。

总的来说,build.gradle文件是用来驱动Gradle构建过程的,它包含了指令指导如何构建。如果没有这些构建工具我们也会做这些任务,比如编译,测试,构建jar,部署等。

我们不必像上一节那样手写任务,我们的IDES,插件会帮我们解决。有许多插件会帮我们自动调用任务,如果我们遵守一定的语法,剩下的就由gradle帮我们解决。

插件(Plugin)是什么?插件是一种拓展Gradle的机制。Gradle需要知道如何去构建任务。当我们已知构建的过程,可以以此创建预构建的任务。这就是插件的角色。

我们不去关注如何写插件,我们学习使用已有的插件帮助我们完成任务。这些插件增加了一些任务供我们直接使用。

Java plugin

我们从对java开发者最重要的java插件开始。不出所料,该插件增加了如下的能力。
1.编译
2.测试
3.打包
这些包含了我们能对java工程所做的一切。打包一般情况下指jar文件。

任何我们需要使用的插件都需要在build.gradle文件中添加如下语句

apply plugin: <plugin-name>

我们这里,由于我们要使用java插件,我们将使用如下的语句:

apply plugin: "java"

让我们从理解这背后发生了什么开始。

创建文件夹example2。你能使用任意文件夹。只要保证gradle在任何文件夹都可以访问。

在我们的文件夹中创建build.gradle文件,添加下面这行:

apply plugin: "java"

正如前面提到的,插件会增加大量的任务来处理Java工程。让我们执行如下命令来理解都增加了哪些任务:

gradle tasks

将会有如下输出:

Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
buildDependents - Assembles and tests this project and all projects that depend
on it.
buildNeeded - Assembles and tests this project and all projects it depends on.
classes - Assembles classes 'main'.
clean - Deletes the build directory.
jar - Assembles a jar archive containing the main classes.
testClasses - Assembles classes 'test'.

如你看到的,已经增加了许多任务,大部分也很好理解:
1.clean会删除构建目录,所有的classes将会被移除以便重新编译。
2.assemble将会创建jar文件。

这些任务会相互依赖,具体看参考文档dependency grgh

Basic Java Project with Gradle Java plugin

有了这些信息,那么问题来了,我们如何调用这些任务呢?

我们已经知道如何调用任务,我们需要如下命令gradle <task-name>。具体到我们的java工程该如何做呢?

我们将遵循一定的规则,这就意味着java插件将会到指定的文件夹中寻找文件。你可以自定义规则,但这不在我们讨论的范围之内。

从官方文档中,java插件遵循如下的文件结构:


图片
图片

这不是强制的,如果你想有不同的文件结构,查看官方文档的source sets。

什么是source sets?它组织了需要编译和构建的源文件。Java插件定义了2个标准的source set,maintest。main集合包含了源文件,这些文件将被编译成jar文件。test集合包含单元测试代码,使用JUnit或TestNG来执行。

我们将按照默认的文件结构来访者我的源文件和测试文件,这意味着:
1.java文件放在src/main/java文件夹下
2.测试文件放在src/main/test文件夹下

我创建了包名com.mindstorm.quoteappsrc/main/java文件夹中,文件结构如下:

图片
图片

quoteapp文件夹中有一个名叫Quote.java文件:

package com.mindstorm.quoteapp;

public class Quote {
 private Long id;
 private String who;
 private String what;
 
 public void setId(Long id) {
 this.id = id;
 }
 public void setWho(String who) {
 this.who = who;
 }
 public void setWhat(String what) {
 this.what = what;
 }
 public Long getId() {
 return id;
 }
 public String getWho() {
 return who;
 }
 public String getWhat() {
 return what;
 }
}

在我们的根目录下example2中有build.gradle文件,该文件只有一条语句apply plugin: “java”

现在,执行如下命令:

gradle assemble

这条命令将你的java文件编译,构建成jar文件。多个其他任务会被执行,
输出如下:

E:\gradle-projects\example2>gradle assemble
:compileJava
:processResources UP-TO-DATE
:classes
:jar
:assemble

这条命令的结果是什么呢?如果一切正常,将会有build文件在你的根目录。在该文件夹下的libs文件夹中有example2.jar

如果你希望清理构建目录,调用gradle clean命令,然后gradle assemble命令。

下面这条命令将会执行check,assemble任务:

gradle -q build

我们稍加改进。如果我们希望生成的jar文件有不同的名字,更新build.gradle文件:

apply plugin: 'java'
archivesBaseName = "quote"
version = '1.0-FINAL'

现在执行gradle assemble,Jar文件将按如下规则命名<name>-<version>.jar,这里是quote-1.0-FINAL.jar

更多细节参考官方文档: official page of the Java plugin.

The beginning of Dependencies

你的Java工程很少不依赖第三方库,考虑上面的Quote.java文件,如果我们增加toString()方法,使用到了第三方库:Apache Commons JAR.

我们看下代码:

package com.mindstorm.quoteapp;
import org.apache.commons.lang3.builder.ToStringBuilder;

public class Quote {
 private Long id;
 private String who;
 private String what;
 
 public void setId(Long id) {
 this.id = id;
 }
 public void setWho(String who) {
 this.who = who;
 }
 public void setWhat(String what) {
 this.what = what;
 }
 public Long getId() {
 return id;
 }
 public String getWho() {
 return who;
 }
 public String getWhat() {
 return what;
 }

 public String toString() {
 return ToStringBuilder.reflectionToString(this);
 }
}

如果你执行gradle assemble命令,将会遇到问题。你将会看到编译错误。

解决方法是修改build.gradle文件,以便它知道如下两件事:
1.编译过程中需要使用到什么Jar文件。
2.到哪里去找这些jar文件。

Gradle的Repository是保存jar文件的地方。Gradle支持主流的Repository比如Maven, lvy等。如果你了解Maven,这听起来很熟悉。

为了配置远程库,在build.gradle中添加如下语句:

repositories {
  mavenCentral()
}

这会使Gradle在指定的Maven中心库需找依赖(JAR 文件)。

每个发布在Maven或其他中心库的文件都有如下的特征:
1.group id
2.artifact id
3.version id
比如,你想定位Apache Commons3,3.2JAR,它将会以如下方式呈现:


上面的图片来自Maven中心库,如果你对你的依赖有疑问,在Maven中心库搜索

Configurations provided by Java plugin

到现在我们为止,我们知道了我们需要在build.gradle文件中提供额外的信息,通过这些信息可以定位到编译时需要的Jar文件。我们明确了去哪里寻找,但是还没有具体指定哪个文件,在我们这里是Apache Commons Lang library。

Gradle引入了Configurations,Configuration是一个依赖的集合,你能利用它们为你的工程声明额外的依赖。

Configuration有哪些?它们叫什么?插件会添加一系列Configurations,我们可以使用它们指定我们的依赖。对于Java 插件有如下标准配置,其中一部分如下:
1.compile
2.runtime
2.testCompile
3.testRuntime
这里我将会引用官方文档:
compile
编译源文件是需要的依赖。
runtime
运行时需要的依赖
testCompile
编译测试源文件是需要的依赖
testRuntime
运行测试时需要的依赖
现在,我们在编译Quote类时,需要依赖Apache Commons Lang 3.3.2,我们在build.gradle中添加如下条目:

apply plugin: 'java'
archivesBaseName = "quote"
version = '1.0-FINAL'

repositories {
 mavenCentral()
}

dependencies {
 compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.3.2'
}

有些注意的地方:
1.每个依赖独自定义
2.你首先指定配置名compile,然后指定库的group, name, version。
3.当前只有一条编译时依赖,你能添加更多其他依赖。
4.还有一个简便的声明依赖的方法:使用'group-value:name-value:version-value',上面的例子里也可以这样声明:

dependencies {
  compile 'org.apache.commons:commons-lang3:3.3.2'
}

保存build.gradle,尝试运行gradle assemble命令。这一次会自动从Maven中心库下载jar文件,添加到本地缓存完成编译过程。

注意
首次编译时,需要连接网络,到Maven中心库下载指定文件。以后将直接在缓存中获取,所以确保网络连接正常。

Some more dependencies

既然我们知道怎么添加编译时依赖,自然需要弄明白怎么添加测试依赖。现在我们使用JUnit,测试实例保存在src/test/java文件夹中。

更新build.gradle文件:

apply plugin: 'java'
archivesBaseName = "quote"
version = '1.0-FINAL'

repositories {
 mavenCentral()
}

dependencies {
 compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.3.2'
 testCompile group: 'junit', name: 'junit', version: '4.+'
}

上面的格式非常熟悉,只是在版本号的地方,使用+号做了代替。这暗示Gradle获取最新的依赖文件。

Download

你可以在这里(需要科学上网)下载整个工程。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,724评论 6 342
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,392评论 25 707
  • 1.介绍 如果你正在查阅build.gradle文件的所有可选项,请点击这里进行查阅:DSL参考 1.1新构建系统...
    Chuckiefan阅读 12,114评论 8 72
  • 大部分 Flask 应用程序会在某一时刻处理存储数据。存在许多不同的方式来存储数据。寻找最好的一种方式完全取决于你...
    邪恶的Sheldon阅读 337评论 0 1
  • 中午独自去看一场电影 老妈打来电话 下午约了姑娘 准备一起晚餐 却忽然雷声大作 天将大雨 姑娘不想出门 我仍然撑起...
    微风LG阅读 348评论 2 1