vlambda博客
学习文章列表

Gradle Vs Maven:Java项目构建工具如何选择?

前言

在Java项目的开发中,需要引入自动化构建工具来帮助我们管理项目的外部依赖包、项目编译、打包等工作。Gradle和Maven是Java世界中两个重要的自动化构建工具,在项目中我们在两者之间如何选择呢?两者有什么异同点呢?


Gradle Vs Maven:Java项目构建工具如何选择?


Gradle是【Java开发人员指南】中推荐的几个核心工具之一,很多开源项目都是采用Gradle进行构建,这得益于Gradle的语法灵活,开发者可以根据自己的实际需求灵活编排构建任务,但Gradle并不是项目构建的唯一选择。Maven是Ant之后最流行的项目构建工具,它解决了Ant复杂的构建方式,提高了项目构建效率,并集成了编译部署等功能。在项目开发中选择哪一种构建方式才是最优的呢?很多开源项目允许开发者选择任何一种方式进行构建,但是两者集成的复杂度完全不一样。所以最终的选择权在于开发者,项目的大小、个性化需求以及一些其它的配置决定了开发者如何在Maven和Gradle之间选择。


Gradle Vs Maven:Java项目构建工具如何选择?



基于Groovy语言的Gradle

Gradle是一个完全自动化的构建自动化系统,它组件的概念和Apache Maven和Ant的概念一样。它使用基于编程语言Groovy的领域特定语言,这与Apache Maven有所不同,后者使用XML进行项目配置。Gradle它使用有向无环图确定运行任务的顺序。

Gradle于2007年首次发布,并于2013年被Google用作Android项目的构建系统它旨在支持非常庞大的多工程构建。它也允许增量添加到项目构建中,因为它知道项目的哪些部分已更新。那些依赖于已经的任务将不再执行。目前,最新的稳定版本是2017年2月发布的3.4版。它支持使用Java,Scala和Groovy进行开发和后续部署,并在将来引入其他项目工作流和语言。

Gradle Vs Maven:Java项目构建工具如何选择?



基于XML语言的Maven

Maven用于Java项目的自动化构建。它可以帮助开发者确定特定软件的构建方式及其不同的依赖关系。它使用XML文件描述正在构建的项目以及与第三方模块有关的软件依赖性,构建顺序以及所需的插件。可以提前定义打包和编译之类的任务。

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

Gradle Vs Maven:Java项目构建工具如何选择?


Gradle与 Maven的比较

Gradle和Maven两种构建方式存在一些根本差异。 Gradle基于任务依赖关系图-其中任务就是工作,而Maven是基于固定的过程和线性模型。使用Maven构建项目时,目标将附加到项目阶段,目标的作用类似于Gradle的任务,即“完成任务的事物”。

在性能方面,两者都允许多模块构建并行运行。但是,Gradle允许增量构建,因为它检查是否更新了哪些任务。如果是这样,则不执行任务,从而使构建时间大大缩短。Gradle上其他出色的性能功能包括:

  • Java类的增量编译

  • 防止反编译

  • 对增量子任务使用API

  • 编译器守护程序加快编译速度

在管理依赖项时,Gradle和Maven都可以处理动态和传递性依赖项,以使用第三方依赖项缓存,并读取POM元数据格式。还可以通过中央版本控制定义声明库版本并强制执行中央版本控制两者都从其artifact 仓库下载可传递依赖项。Maven具有Maven Central,而Gradle具有JCenter,也可以定义自己的私人公司存储库。如果需要多个依赖项,Maven可以同时下载它们。

Gradle Vs Maven:Java项目构建工具如何选择?


但是,Gradle在自定义API实现依赖项和并发安全缓存方面优于Maven它还将存储库元数据与缓存的依赖项保持在一起,确保使用同一缓存的两个或多个项目不会相互覆盖,并且具有基于校验和的缓存,并且可以将缓存与存储库同步。此外,Gradle与IVY元数据兼容,允许定义自定义规则来为动态依赖项指定版本,并解决版本冲突。这些功能在Maven上并没有实现。Gradle具有完全可配置的DAG,而对于Maven,一个目标只能附加到另一个目标,多个目标采用有序列表的形式,也就是线性关系。Gradle还允许任务排除,传递排除和任务依赖推断。


示例代码

前文讲了Maven和Gradle构建配置的方式不一样,Maven基于XML文件配置,而Gradle基于Groovy语言配置管理,我们以一个样例代码说明同一个项目分别用两种方式构建。我们定义一个test的项目,该项目需要junit依赖包和一些优化代码的插件(Maven CheckStyle,FindBugs和PMD)

  • 首先看Maven的配置

Gradle Vs Maven:Java项目构建工具如何选择?



Gradle Vs Maven:Java项目构建工具如何选择?


从示例代码可以看到我们写了很多的的XML配置,定义了项目的group、artifactId和打包的格式,同时定义了netty的依赖。因为要用到Maven CheckStyle,FindBugs和PMD的插件来优化和检查代码,所以我们也定义了相应的插件。如果我们的项目需要大量的外部依赖和插件,那我们这个POM文件就非常大。

  • 其次,我们再来看看gradle中的配置

如果项目是基于gradle构建,那构建配置文件是build.gradle。


Gradle Vs Maven:Java项目构建工具如何选择?



可以看到使用gradle进行构建的时候,同样的项目,只需要编写不到10行的代码,而maven差不多写了50行左右的代码,这就是gradle的优势。

重点:如何选择

总而言之,Maven和Gradle两种构建工具有各自的优缺点。

  • 个性化编译:使用Maven,开发者可以轻松定义项目的元数据和依赖项,但是创建高度自定义的版本可能是Maven用户的噩梦。随着项目的增长,POM文件很容易膨胀,并且以后可能会成为无法读取的XML文件。

  • 依赖管理和目录结构:Maven提供了简单而有效的依赖关系管理,并且由于它具有项目的目录结构,因此所有项目都具有某种标准布局。它为其POM文件使用一个声明性XML文件,并具有许多可以使用的插件。Gradle使用Maven上相同的目录结构,但是可以自定义。它还使用了与Maven用来识别工件的GAV格式相同的格式。

  • 插件和集成:Maven具有很多的插件,并与第三方工具(例如CI服务器,代码覆盖插件和工件存储库系统)无缝集成。就插件而言,现在有越来越多的可用插件,并且有大型厂商具有与Gradle兼容的插件。

  • 灵活性:另一方面,Gradle非常灵活,并且基于脚本。自定义构建将很容易在Gradle上完成。



结论

选择哪种构建工具取决于我们的实际需求,Gradle功能更强大。但是,有时候一个中小型的项目不需要它提供的大多数功能,则Maven可能就是最佳选择。而Gradle则是大型项目的最佳选择。如果一直在使用Maven,但发现项目越来越大,已经不适合使用Maven,这时候就可以从Maven迁移到Gradle。




来源:

https://www.toutiao.com/i6802933126583550475/

“IT大咖说”欢迎广大技术人员投稿,投稿邮箱:[email protected]



来都来了,走啥走,留个言呗~




 IT大咖说  |  关于版权 

感谢您对IT大咖说的热心支持!



相关推荐


推荐文章