Gradle是基于JVM构建工具的新一代版本。它从现有的构建工具如Ant和Maven中学到了不少东西,而且把它们的最优思想提高到更高层次。遵循基于约定的构建方式,Gradle能够用一种声明式的方式为你的问题领域建模,它使用一种强大的且具备表达性的基于Groovy的领域特定语言(DSL),而不是XML,由于Gradle是基于JVM的,它容许你使用本身最喜欢的Java或Groovy语言来编写定制逻辑。node
为何应该选择Gradlespring
Gradle构建脚本是声明式的,可读的,而且清晰地表达它们的意图。用Groovy而不是XML写代码,挥洒着Gradle基于约定建构的哲理,大大地下降构建脚本的大小并且更易读。看到用Gradle实现相同的目标所须要编写的代码时确实让人感到惊讶。使用Gradle时,你不须要作出妥协。而像Maven这样的构建工具提出的项目布局就是“要么个人方式,要么复杂的方式”,Gradle的DSL提供了灵活性去适应非约定项目布局。Gradle的座右铭: “让不可能成为可能,让可能变得简单,让简单变得优雅”。不要改变一个正在运行的系统,你说呢?你的团队已经花费大量的时间来创建项目构建代码基础设施。Gradle并不强迫你彻底迁移全部的构建逻辑。它和其余构建工具如Ant和Maven有很是好的集成,这是Gradle优先级列表中的最高优先级。市场彷佛注意到Gradle,在Spring2010会议上,Gradle由于最具创新性开源项目被授予Springy大奖(http://www.springsource.org/node/2871 )。注:目前每个Android项目都使用Gradle做为默认的构建系统。
编程
Gradle引入注目的特性集缓存
可表达性的构建语言和底层的API服务器
在Gradle脚本中每个元素都有一个与Java类一对一的映射。然而,某些元素被Groovy的语法糖衣包装着。在许多状况下Groovy化的类相对于Java,代码更加简洁,而且容许使用如闭包这样的新语言特性。闭包
Gradle不可能知足企业级构建的全部需求。经过暴露钩子(hook)到生命周期阶段,Gradle容许监控和配置构建脚本的执行行为。编程语言
经过暴露用Groovy语言实现的DSL,Gradle为它的建模创建了一个词库。当处理复杂的领域问题时,好比构建软件,Gradle就成为一种强有力的工具,能够用一种通用的语言去表达构建逻辑。让咱们来看一些例子。最多见的构建就是执行一个工做单元。Gradle将这个工做单元描述成任务(task)。Gradle的标准DSL部分就是可以确切地定义任务,从编译到打包Java源代码。这是一种用自身词汇构建Java项目的语言,且这种语言与其余环境无关。分布式
另外一个例子就是你可以表达对外部库的依赖,这是构建工具须要解决的常见问题。Gradle的开箱即用特性提供了两个配置块,容许你定义依赖以及远程仓库。若是标准的DSL元素不能知足你的需求,则能够经过Gradle的扩展机制引入你本身的词汇。工具
Gradle就是Groovy布局
Gradle的DSL是由Groovy实现的,它提供了基于Java的语法糖。结果就是产生了一种具备可读性和表达性的构建语言。全部你写的脚本都是Groovy。可以用编程语言来表达你须要的构建是Gradle的一大亮点。
灵活的约定
Gradle最主要的思想之一就是针对你的项目给予引导和有意义的默认值。Gradle中的每一个Java项目都确切地知道源代码和测试类文件的位置,知道如何编译代码,运行单元测试,生成Javadoc报告,以及发布代码。全部这些任务都彻底集成到了构建生命周期中。若是你坚持使用约定,那么只须要一点配置。
对于一个Java项目,Gradle已经提供了默认的有意义的任务。例如,你能够编译Java源代码,运行测试和组装Jar文件。每一个Java项目都以一个标准的目录布局开始。它定义了在哪里能够找到源代码,资源文件和测试代码。能够经过约定属性来改变它们的默认值。
Gradle的约定和Maven提供的约定类似,但不会让你感受到被限制。Ant不会给你任何关于如何组织构建脚本方面的指导,以确保最大程序的灵活性。Gradle则折中选择,即提供约定,又给予你改变约定的能力。
鲁棒和强大的依赖管理
Gradle提供了一个基础设施去管理解析,获取和存储依赖复杂性。一旦它们被下载并存储到本地缓存中,你的项目就可使用了。企业构建的一个关键需求是可重现性,构建在不一样的机器上产生相同的结果,不受本地缓存内容的影响。像Ivy和Maven这样的依赖管理器,在它们当前的实现中也不能彻底保证可重现性。为何?当一个依赖被下载并存储在本地缓存中时,它还不算是待构建工做的源。在某些状况下仓库由于项目而改变,缓存的依赖被认为是已解析过的,即便工件的内容可能有一点点不一样。最坏的状况是,它会致使构建失败,并且很难调试。对于Ivy另外一个常见问题是依赖的快照版本,处于开发阶段的工件,约定的名字是-SNAPSHOT,不会在本地缓存中更新,即使它在仓库中已经改变和标记为改变。还有更多的状况说明当前的解决方案是有缺陷的。Gradle提供了它本身的可配置的,可靠的和有效的依赖管理方案。
大型的企业级项目一般是由多个不一样功能的模块组成的。在Gradle的世界里,每一个子模块都被看成一个项目,里面会定义对外部库或者其余模块的依赖。此外,每一个子模块均可以独立运行。Gradle帮你找到哪一个子项目的依赖须要从新构建,而不须要将子项目的工件存储到本地缓存中。
可扩展的构建
对于某些公司,大型的项目可能拥有上百个模块。构建和测试少许代码的改变会消耗不少时间。从我的经验中你可能知道运行清理任务来删除老的class文件和资源文件就证实了这一点。构建工具不知道找出改变的内容和它们的依赖,这经常让你很受伤。你须要的工具应该是足够聪明的,知道只从新构建项目中改变的部分。
Gradle支持经过指定任务的输入和输出进行增量性构建。它准确地找出哪些任务须要跳过,哪些须要构建或者部分构建。一样的思想也应用到多模块项目中,叫作部分构建。由于你的构建清晰地定义了子模块之间的依赖关系,Gradle会负责从新构建须要的部分。再也不是默认执行clean任务!
自动化单元测试,集成测试和功能测试是构建过程的一部分。将只须要短期运行的测试和那些须要准备资源和外部依赖的测试分离是有道理的。Gradle支持测试的并行执行。这个特性是彻底可配置的,而且确保你确实正在利用处理器的内核。优势不止这些。在以后的版本中,Gradle还将支持在多台机器上执行分布式测试。
开发人员在开发过程当中会屡次运行构建。那意味着每次都启动一个新的Gradle进程,载入全部的内部依赖和运行构建逻辑。你会注意到,在实际执行脚本以前会有几秒钟的等待时间。要提升启动的效率,Gradle能够以守护进程模式运行。实际上,Gradle命令会fork出一个守护进程,它不只会执行你的构建,并且会持续地在后台运行。后续的构建调用会交给这个守护进程以免启动时的消耗。这样,你就会看到一个更快速的初始化构建执行。
轻松的可扩展性
大部分企业构建都不同,它们也不会解决相同的问题。一旦完成了创建基本构建脚本的初始化阶段,你就会开始实现定制逻辑。Gradle不会对于如何实现代码给出任何建议。相反,根据你的具体用例,它会提供给你不一样的选择。最简单的实现定制逻辑的方式是实现一个任务。任务能够直接在构建脚本中定义而不须要特殊的配置。若是你以为太过复杂,你也许想要找一种能够在类定义中写定制化逻辑的方法,这样可让维护和编写代码更简单。若是你想要在多个构建或者项目中分享可重用代码,插件是最好的方式。它是Gradle最强大的扩展机制,插件可让你彻底访问Gradle的API,并且能够像任何其余软件同样,编写,测试和发布。写一个插件很是的简单,彻底不须要一大堆额外的描述符。
和其余构建工具集成
若是可以和其余现有的构建工具集成,难道不是至关节省时间吗?Gradle与它的前辈Ant,Maven和 Ivy 能够作很好的集成。若是你是Ant的使用者,Gradle并不强制你彻底迁移构建基础设施。相反,它容许你导入如今的构建逻辑并重用标准的Ant任务。Gradle构建和Maven及 Ivy 仓库100%兼容。你能够从中获取依赖,也能够发布工件。对已有的Maven构建,Gradle提供了一个转换器能够将Maven构建逻辑转换为Gradle的构建脚本。
现有的Ant脚本能够无缝地导入到Gradle构建中,并且就像你使用其余外部Gradle脚本同样使用它。在运行时,Ant的target直接映射到Gradle的task。Gradle装载了Ant的类库并将一个叫做AntBuilder的帮助类暴露到你的脚本中,并且是彻底嵌入到Gradle的DSL中的。它仍然和Ant的XML类似,可是没有了难看的括号。Ant用户会感受到宾至如归,由于他们不须要马上转换为Gradle的语法。从Ant到Gradle的迁移也是不须要太伤脑筋的。你能够经过重用现有的Ant逻辑,在感觉Gradle特性的同时,小步迁移。
Gradle旨在与Maven集成时可以作到与Ant相同的程度。但目前它尚未作到。长期而言,Maven的POM和插件都会被看做Gradle原生的一部分。Maven和 Ivy仓库已经成为今天构建基础设施的一个重要部分。
锦上添花:额外的特性
难道你不讨厌给不一样的项目安装新的运行时环境?Gradle包装器是救星!它容许你在任何须要运行构建的机器上从一个指定的仓库下载和安装一个Gradle运行时的新拷贝。这个过程是在第一次构建执行时自动触发的。包装器对于给一个发布团队分享你的构建或者在持续集成服务器上运行构建是很是有用的。
Gradle也装载了一个丰富的命令行接口。使用命令行选项,你能够控制全部的东西,从指定日志级别,到排除测试,再到显示帮助信息。这没有什么特别的,其余工具也提供了。只是某些特性比较突出。Gradle容许命令是驼峰形式的缩写。举例来讲,一个名字是runMyAwesomeTask的命令能够 rMAT 的缩写形式调用。很方便,是否是??