关于构建工具(build tool)的认识

浅谈Build Tool

1.构建工具的基本介绍
在编程世界中有三大构建工具,ant、Maven和Gradle。现在的状况是maven和gradle并存,gradle使用的越来越广泛。Maven使用基于XML的配置,Gradle采用了领域特定语言Groovy的配置。在Maven中要引入一个依赖。

Gradle是一个完全开源的构建自动化系统,它使用您在Apache Maven和Apache Ant上看到的概念。它使用基于编程语言Groovy 的特定于域的语言,将其与Apache Maven区分开来,后者使用XML进行项目配置。它还通过使用有向无环图确定任务的顺序。

一些开发人员创建了Gradle并于2007年首次发布,并且在2013年,它被Google采用为Android项目的构建系统。它旨在支持预计会非常庞大的多项目构建。它还允许逐步添加到您的构建中,因为它知道项目的哪些部分已更新。不再重新执行依赖于更新部件的任务。目前,最新的稳定版本是3.4版本,于2017年2月推出。它支持使用Java,Scala和Groovy进行开发和后续部署,以及将来引入的其他项目工作流程和语言。

什么是Maven?

Maven用于使用Java进行项目构建自动化。它可以帮助您绘制特定软件的构建方式,以及它的不同依赖关系。它使用XML文件来描述您正在构建的项目,软件与第三方模块和部件的关系,构建顺序以及所需的插件。有诸如打包和编译之类的任务的预定义目标。

Maven将从不同的存储库下载库和插件,然后将它们全部放在本地计算机的缓存中。虽然主要用于Java项目,但您可以将它用于Scala,Ruby和C#,以及许多其他语言。

Gradle vs. Maven

两种系统的构建方式存在一些根本区别。Gradle基于任务依赖关系图 - 其中任务是完成工作的事情 - 而Maven基于固定和线性的阶段模型。通过Maven,目标与项目阶段相关联,目标与Gradle的任务具有相似的功能,即“完成工作的事物”。

在性能方面,两者都允许多模块构建并行运行。但是,Gradle允许增量构建,因为它会检查哪些任务已更新。如果是,则不执行任务,从而缩短构建时间。您可以在Gradle上找到的其他与众不同的性能功能包括:

Java类的增量编译
编译避免Java
使用API进行增量子任务
一个编译器守护程序,它也使编译速度更快
在管理依赖关系时,Gradle和Maven都可以处理动态和传递依赖关系,使用第三方依赖关系缓存,以及读取POM元数据格式。您还可以通过中央版本控制定义声明库版本并强制执行中央版本控制。两者都从其工件存储库下载传递依赖项。Maven拥有Maven Central,而Gradle拥有JCenter,您也可以定义自己的私人公司存储库。如果需要多个依赖项,Maven可以同时下载这些依赖项。

然而,Gradle在API和实现依赖性方面获胜,并且本身允许并发安全缓存。它还保存存储库元数据以及缓存的依赖关系,确保使用相同缓存的两个或多个项目不会相互覆盖,并且它具有基于校验和的缓存,并且可以将缓存与存储库同步。此外,Gradle与IVY元数据兼容,允许您定义自定义规则以指定动态依赖关系的版本,并解决版本冲突。这些在Maven上不可用。

您只能在Gradle上找到的其他依赖关系管理功能包括:

对兼容库使用替换规则
使用ReplacedBy规则
更好的元数据解析
能够动态地用外部项替换项目依赖项,反之亦然
Gradle还使您在使用复合构建时更轻松,并且它使您能够使用临时和永久复合构建,以及组合不同构建并将复合构建导入到IntelliJ IDEA的Eclipse中。

就执行模型而言,它们都有任务组和描述。两者都使您能够仅构建指定的项目及其依赖项。但是,Gradle具有完全可配置的DAG,而对于Maven,目标只能附加到另一个目标。多个目标采用有序列表的形式。Gradle还允许任务排除,传递排除和任务依赖性推断。Gradle还具有任务排序和终结器等高级功能。

管理构建基础结构是Gradle的另一个优势,因为它使用接受自动配置的包装器,而对于Maven,您需要具有支持自配置构建的扩展。Gradle还允许您配置基于版本的构建环境,而无需手动设置它们。它还允许自定义分发。

在Ant,Gradle和Maven的比较中,Naresh Joshi比较了创建构建脚本所需的代码,该脚本编译,执行静态分析,运行单元测试,并在Programming Mitra中创建JAR文件 。

如何选择

总的来说,这两种工具都有各自的优点和缺点。

定制的构建。 使用Maven,您可以轻松定义项目的元数据和依赖项,但创建高度自定义的构建可能是Maven用户的噩梦。随着项目的增长,POM文件很容易变得臃肿,以后可能是一个不可读的XML文件。
依赖管理和目录结构。尽管如此,Maven提供了简单而有效的依赖管理,并且由于它具有项目的目录结构,因此您可以为所有项目提供某种标准布局。它为其POM文件使用声明性XML文件,并且有许多可以使用的插件。Gradle使用您在Maven上看到的目录结构,但这可以自定义。它还使用Maven用于识别工件的相同GAV格式。
插件和集成。Maven还支持各种构建生命周期步骤,并与第三方工具(如CI服务器,代码覆盖插件和工件存储库系统)无缝集成。就插件而言,现在有越来越多的可用插件,并且有大型供应商拥有与Gradle兼容的插件。但是,与Gradle可用的数量相比,Maven还有更多可用的插件。
灵活性。另一方面,Gradle非常灵活,基于脚本。在Gradle上可以很容易地进行自定义构建。但是,由于Gradle 实际上是一个新手,因此了解Gradle由内到外的开发人员数量可能有限。
最后,您选择的内容主要取决于您的需求。Gradle更强大。但是,有时您真的不需要它提供的大多数功能和功能。Maven可能最适合小型项目,而Gradle最适合大型项目。如果您一直在使用Maven并发现您的项目已经超出它,则可以从Maven迁移到Gradle。

总结
总的来说,gradle相比于maven有很打的灵活性,目前gradle的使用者越来越多。而由于maven之前处于主流,并且在某些方面maven较gradle还有一些优点,所以maven和gradle并存。在github上大多数优秀的开源项目会同时提供maven和gradle两种添加依赖的方式。

引用资料:
Gradle 快速入门:http://www.cnblogs.com/CloudTeng/p/3417762.html
使用Eclipse构建Maven项目 (step-by-step):http://blog.csdn.net/qjyong/article/details/9098213
Java构建工具:Maven与Gradle的对比:https://zhuanlan.zhihu.com/p/21394120
Maven和Gradle对比:http://www.importnew.com/18008.html
Gradle百度百科:http://baike.baidu.com/link?url=hSWZcIkUa4BhaSHU5_P9y9qwAOrJjrrOEdAKeLK0x4roK-jeC1AbxxAucHZyU8ZA02_LKlvc2Sg-UPbMyl8lO_

猜你喜欢

转载自blog.csdn.net/qq_38413862/article/details/88187011