Gradle之介绍

Stella981
• 阅读 749

Gradle是基于JVM构建工具的新一代版本。它从现有的构建工具如Ant和Maven中学到了很多东西,并且把它们的最优思想提升到更高层次。遵循基于约定的构建方式,Gradle可以用一种声明式的方式为你的问题领域建模,它使用一种强大的且具有表达性的基于Groovy的领域特定语言(DSL),而不是XML,因为Gradle是基于JVM的,它允许你使用自己最喜欢的Java或Groovy语言来编写定制逻辑。

为什么应该选择Gradle

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 的缩写形式调用。很方便,是不是??

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
九路 九路
4年前
Gradle技术之一 Groovy语法精讲
Gradle技术之一Groovy语法精讲gradle脚本是基于groovy语言开发的,想要学好gradle必须先要对groovy有一个基本的认识1.Groovy特点groovy是一种DSL语言,所谓的DSL语言,就是专门针对某一特定领域的语言,专精而不专广是一种基于JVM的开发语言,也是编译成class字节码文件结合和Pytho
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Gradle的安装与配置及Spring源码导入(亲测)
前言我这边使用的gradle版本是:gradle6.5.1idea版本是:ideaIU2019.3.1jdk:1.8Gradle简介Gradle是源于ApacheAnt和ApacheMaven概念的项目自动化构建开源工具,它使用一种基于Groovy的的特定领域语言(
Stella981 Stella981
3年前
Gradle的基本使用
Gradle的介绍Gradle是一个基于ApacheAnt和ApacheMaven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。面向Java应用为主。当前其支持的语言限于Java、Groovy和Scala,计划未来将支持更多的语言。Gra
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这