gradle入门到实践2

来源:互联网 发布:医疗数据集成 编辑:程序博客网 时间:2024/06/15 08:43

这篇博客将开始翻译grale 官方电子使用教程,如有人看过英文原版,觉得有翻译不妥当之处,欢迎指正

第一章   你好,gradle!

在过去几十年里面,对受到ant 和maven好处和坏处的使用者而言,ant,maven已经占据了构建圈的对立的位置,ant选择对用户提供巨大的灵活性,不强加任何的协定,而且在构建上不强加任何繁重的依赖管理基础构造,Apace Ivy 后来对java构建添加了非常必须的依赖管理,但是始终没有解决Ant固有的对协定的缺乏,另一方面,Maven提供了严格的标准和对依赖管理的支持,但是他的标准经常感觉很麻烦,比期望的要麻烦很多。

Ant和Maven在Java市场上都取得了很大的成功,不管他们这两种工具的缺点,在一方面,gradle代表了他们两个极端的一个平衡点,提供了深思熟虑的协定来给你的构建去遵守,同时当你想要扩展或者精炼这些协定的时候也会很容易,gradle提供开箱即用的协定的同时意识到没有一套标准是能够精准的为每个构建所用,因此gradle意图变成一个开发的组织和具体工程的构建标准的方法,gradle的目的不是提供一系列构建标准,而是变成使用丰富的,描述性的语言来发展和扩展这些标准的工具集。

gradle在处理构建依赖的时候也提供一些方法,如果你工程的模型是通过名字声明不多的高等级依赖,让你的构建工具确定其他的Libraries必须存在用来支持你所声明的依赖(也就是传递依赖管理),gradle也会与Maven和Ivy仓库相配合支持这种方法。如果你想要下载JAR文件和在本地的工程目录里面组织依赖,gradle当然也会支持。每种依赖都能解决是最好的思想,灵活性是非常重要的,尤其是迁移构建工具到gradle,不管其他的构建工具如何处理依赖,gradle 都将支持。

gradle特征丰富,但是它也不是一个固定的框架,让你不能做你自己想做的事情。它为想要协定的人提供协定,为想要扩展的人提供灵活的方法,也转变这种灵活性到你可以写你自己的特定领域构建标准,不管它在配置圈的微妙地位,它提供了其他构建工具没有的有高效率,灵活性,我们接下来通过这本书来探索gradle

1.1 在Groovy里构建文件

一个潜在的复杂构建文件需要一个有表达性强的格式,在十年以前,XML曾经是构建工具的一个选择,当XML是一个新兴技术的时候,开发者对它充满热情,没有人阅读大量XM时L感到痛苦,它对人类看起来有非常好的可读性,也很简单写代码来解析它,然而,十多年的经验告诉我们大而且复杂的XML文件只是容易被机器理解,确并不容易被人理解,而且XML严格的结构限制了格式的表达性,经常可以在XML文件中看到嵌套式的结构,但是对于大部分常用编程语言模型的程序流和数据存取来说,这种结构很难表达,所以,XML并不是构建文件的一个好的格式

gradle使用Groovy来表达构建文件,Groovy是JVM的一种动态语言,与Java在很多角度都很类似,但是有一些显著地区别,每一个gradle构建文件都有一个可执行的Groovy脚本,作为Gradle的新手,你甚至不用意识到你在写Groovy代码,但是你如果需要做的更复杂,更专业,那使用Groovy语言的能力就变的很重要。不像ant和Maven构建文件的格式,Gradle基于Groovy的构建文件允许你做很多的构建任务,这解放了很多使用缺少控制流的ant和使用Maven完成非标准任务时被强制插件开发的开发者。


1.2领域特定构建语言

每一个维护复杂构建的开发者都希望只写几行代码在构建文件里面,有时候你只是需要一个迭代器,,有时候你想要不大幅度修改构建文件的前提下表达一个一般复杂的条件

但是这种通过复杂的构建系统从而使你无限制的按你自己的方法变成真的是一件好事情吗?这时候我们要重新回顾灵活性的定义,灵活性并不是复杂到理解你随心所欲的想法,而是灾难发生的可维护型。自从Gradle使用Groovy脚本写构建文件,它提供了你可以在构建过程中任何时间进入脚本模式来空指,但是一般不推荐过度使用这种方法。

而且,Gradle并不仅仅支持Groovy,而且支持领域特定语言(DSL)定做的构建代码,一个Gradle用户在使用这个之前,不管有没有Groovy开发经验都是可以的。这种DSL使用准确描述的软件构建任务模型来描述构建,并不是一般意义上的写代码,一般意义上的写代码通常可以作为回调来获得,但是Gradle优雅的建议用户优先选择使用DSL模型来描述构建,第二选择才是编程。

当标准的Gradle DSL并不能完整描述你想要构建的任务的时候,你可以通过插件来扩展DSL,比如,Gradle包含需要知道怎么构建Java代码和在输出中创建 WAR文件的描述语言,然而,不包含知道怎么构建运行数据库迁移脚本和部署代码到云平台的服务器上的描述语言,通过Gradle插件,你可以添加新的任务定义,改变已经存在任务的行为,添加新的对象,创建区分于传统Gradle种类中已经有的新的关键词来描述任务,即使通过一个简单自定义Gradle任务机制,你可以引入一些新的构建词汇,使得一些必须的大段代码变成简单的几句声明。

如果你使用过Maven,你必须理解Gradle里插件的概念和Maven中插件的概念不太一样,在Maven里面,是一个带有特定的功能的扩展Maven的方法,一般在你的构建过程中会实施,通常在Maven精心设计的生命周期内会出现在一个阶段或者多个阶段。而Gradle中,插件可以通过引入一个或多个任务来提供了可配置的构建动作,但是经常作为一种扩展构建DSL的方法。

在你写构建文件中使用和扩展Gradle DSL是更好的选择,然而你还是可以在你的构建文件中写Groovy代码来最优化的解决你所遇到的问题,可维持性最强的构建最终将代码重构成组织好的插件,变成新的构建语言模型,使得别的构建文件可以使用它们。因此你可以在你的商业和技术领域使用高层次,表达性强的语言来构建系统。

1.3 开始Gradle


上一篇博客有安装方法,这里不赘述了

这里补充一下,Liunx和MacOS用户可以使用下面的命令安装压缩包

$wget http://repo.gradle.org/gradle/distributions/gradle-1.0-bin.zip

书上是1.0版本了,现在是2.8,具体安装哪个版本可以自己选择

然后就是解压配置环境变量,不清楚的看我上一篇博客。

1.4 万事helloworld起

1.4.1我们创建一个文件名为build.gradle的文件

文件内容:
task helloworld <<{
println 'hello,world'

}

终端输入: 

$gradle -q helloworld

输出:hello,world

1.4.2 高级一点,hello world 在两个任务里

task hello <<{

print 'hello,'

}

task world(dependsOn:hello) <<{

println 'world'

}

终端输入:

$gradle -q world

输出:hello,world

1.5 构建一个Java程序

helloworld没有什么实际用处,也不会有人只是为了在终端输出信息来执行一个构建,现在我们来看看Gradle如果构建一个简单的Java程序,

先写一个build.gradle,只需要一行

apply plugin: 'java'

再写一个Java程序



package org.gradle.example.simple;
public class HelloWorld{
    public  static  void main(String args[]){
    System.out.println("hello,world");
}
}

好了,这时候你的目录结构如下:

|-build.gradle

|-src

     |-main

          |-java

                |-org

                       |-gradle 

                                |-example

                                             |-sample

                                                     |-HelloWorld.java


在终端运行

:$gradle build

你可以得到如下目录结构


实际上,现在2.8版本目录结构是这样的

但是主要结构差不多,注意到不仅仅是Java代码被编译了,而且它的class文件被放在了一个我们不需要配置的目录上,而且在Lib目录下构建了一个JAR,这些都是Gradle java 插件的协定结果,我们不需要写一行配置文件,我们可以这样的运行我们的Java应用


1.6 Gradle命令行

--help或者-h                        获得帮助信息

-Dproperty=value  定义一个系统属性


--info 或 -i 查看日志


--debug 或-d 输出debug日志,产生很多的输出,但是对于定位bug非常有用

 --dry-run 或 -m    评价和运行构建文件,但是不执行任务

--quiet 或者 -q  抑制大部分的输出,仅仅输出log信息

--gui  启动 Gradle 的GUI

--stacktrace 或者 -s  当构建的时候有异常抛出的时候产生一个简短的堆栈跟踪

--full-stacktrace 或者-S 产生一个更长的堆栈跟踪输出

properties   列出构建工程对象的属性

tasks 发出当前构建文件中可获得任务列表

3 0