【转】Java项目构建工具Gradle是否可以完全替代Maven?
前言
在Java项目的开发中,需要引入自动化构建工具来帮助我们管理项目的外部依赖包、项目编译、打包等工作。Gradle和Maven是Java世界中两个重要的自动化构建工具,在项目中我们在两者之间如何选择呢?两者有什么异同点呢?
Gradle是【Java开发人员指南】中推荐的几个核心工具之一,很多开源项目都是采用Gradle进行构建,这得益于Gradle的语法灵活,开发者可以根据自己的实际需求灵活编排构建任务,但Gradle并不是项目构建的唯一选择。Maven是Ant之后最流行的项目构建工具,它解决了Ant复杂的构建方式,提高了项目构建效率,并集成了编译部署等功能。在项目开发中选择哪一种构建方式才是最优的呢?很多开源项目允许开发者选择任何一种方式进行构建,但是两者集成的复杂度完全不一样。所以最终的选择权在于开发者,项目的大小、个性化需求以及一些其它的配置决定了开发者如何在Maven和Gradle之间选择。
基于Groovy语言的Gradle
Gradle是一个完全自动化的构建自动化系统,它组件的概念和Apache Maven和Ant的概念一样。它使用基于编程语言Groovy的领域特定语言,这与Apache Maven有所不同,后者使用XML进行项目配置。Gradle它使用有向无环图确定运行任务的顺序。
Gradle于2007年首次发布,并于2013年被Google用作Android项目的构建系统。它旨在支持非常庞大的多工程构建。它也允许增量添加到项目构建中,因为它知道项目的哪些部分已更新。那些依赖于已经的任务将不再执行。目前,最新的稳定版本是2017年2月发布的3.4版。它支持使用Java,Scala和Groovy进行开发和后续部署,并在将来引入其他项目工作流和语言。
基于XML语言的Maven
Maven用于Java项目的自动化构建。它可以帮助开发者确定特定软件的构建方式及其不同的依赖关系。它使用XML文件描述正在构建的项目以及与第三方模块有关的软件依赖性,构建顺序以及所需的插件。可以提前定义打包和编译之类的任务。
Maven将从不同的仓库下载库和插件,然后将它们全部放入本地计算机的缓存中。虽然主要用于Java项目,但是开发者可以将其用于Scala,Ruby和C#以及其他多种语言。
Gradle与 Maven的比较
Gradle和Maven两种构建方式存在一些根本差异。 Gradle基于任务依赖关系图-其中任务就是工作,而Maven是基于固定的过程和线性模型。使用Maven构建项目时,目标将附加到项目阶段,目标的作用类似于Gradle的任务,即“完成任务的事物”。
在性能方面,两者都允许多模块构建并行运行。但是,Gradle允许增量构建,因为它检查是否更新了哪些任务。如果是这样,则不执行任务,从而使构建时间大大缩短。Gradle上其他出色的性能功能包括:
- Java类的增量编译
- 防止反编译
- 对增量子任务使用API
- 编译器守护程序加快编译速度
在管理依赖项时,Gradle和Maven都可以处理动态和传递性依赖项,以使用第三方依赖项缓存,并读取POM元数据格式。还可以通过中央版本控制定义声明库版本并强制执行中央版本控制。两者都从其artifact 仓库下载可传递依赖项。 Maven具有Maven Central,而Gradle具有JCenter,也可以定义自己的私人公司存储库。如果需要多个依赖项,Maven可以同时下载它们。
但是,Gradle在自定义API实现依赖项和并发安全缓存方面优于Maven。它还将存储库元数据与缓存的依赖项保持在一起,确保使用同一缓存的两个或多个项目不会相互覆盖,并且具有基于校验和的缓存,并且可以将缓存与存储库同步。此外,Gradle与IVY元数据兼容,允许定义自定义规则来为动态依赖项指定版本,并解决版本冲突。这些功能在Maven上并没有实现。Gradle具有完全可配置的DAG,而对于Maven,一个目标只能附加到另一个目标,多个目标采用有序列表的形式,也就是线性关系。 Gradle还允许任务排除,传递排除和任务依赖推断。
示例代码
前文讲了Maven和Gradle构建配置的方式不一样,Maven基于XML文件配置,而Gradle基于Groovy语言配置管理,我们以一个样例代码说明同一个项目分别用两种方式构建。我们定义一个test的项目,该项目需要junit依赖包和一些优化代码的插件(Maven CheckStyle,FindBugs和PMD)。
- 首先看Maven的配置
从示例代码可以看到我们写了很多的的XML配置,定义了项目的group、artifactId和打包的格式,同时定义了netty的依赖。因为要用到Maven CheckStyle,FindBugs和PMD的插件来优化和检查代码,所以我们也定义了相应的插件。如果我们的项目需要大量的外部依赖和插件,那我们这个POM文件就非常大。
- 其次,我们再来看看gradle中的配置
如果项目是基于gradle构建,那构建配置文件是build.gradle。
可以看到使用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。