在构建自动化工具时,Gradle和Maven是两个重头戏。了解每个的优点和缺点,并学习何时使用它们。
Gradle是Stackify的《综合Java开发人员指南》中介绍的几种Java开发工具之一,但它不是唯一要考虑的构建自动化工具。Maven是较旧且常用的替代方法,但是哪种构建系统最适合您的项目?使用其他工具(例如Spring),允许开发人员在两个系统之间进行选择,再加上对这两个系统越来越多的集成,决定很大程度上取决于您。项目的大小,自定义的需求以及其他一些变量可以帮助您选择。让我们来看看。
Gradle是一个完全自动化的构建自动化系统,它使用您在Apache Maven和Apache
Ant上看到的概念。它使用基于编程语言Groovy的领域特定语言,这与Apache
Maven有所区别,后者使用XML进行项目配置。它还使用有向无环图来确定任务的运行顺序。几位开发人员创建了Gradle,并于2007年首次发布,并于2013年被Google用作Android项目的构建系统。它旨在支持预计将非常庞大的多项目构建。它也允许以增量方式添加到构建中,因为它知道项目的哪些部分已更新。依赖于更新零件的任务将不再执行。目前,最新的稳定版本是2017年2月发布的3.4版。它支持使用Java,Scala和Groovy进行开发和后续部署,并在将来引入其他项目工作流和语言。
Maven用于使用Java进行项目构建自动化。它可以帮助您确定特定软件的构建方式以及其不同的依存关系。它使用XML文件来描述您正在构建的项目,与第三方模块和部件有关的软件依赖性,构建顺序以及所需的插件。有诸如打包和编译之类的任务的预定义目标。
Maven将从不同的存储库下载库和插件,然后将它们全部放入本地计算机的缓存中。虽然主要用于Java项目,但是您可以将其用于Scala,Ruby和C#,以及许多其他语言。
两种系统方法的构建方式存在一些根本差异。Gradle基于任务依赖关系图-其中任务就是工作,而Maven基于固定和线性的阶段模型。使用Maven,目标将附加到项目阶段,目标的作用类似于Gradle的任务,即“完成工作的事物”。
在性能方面,两者都允许多模块构建并行运行。但是,Gradle允许增量构建,因为它检查是否更新了哪些任务。如果是这样,则不执行任务,从而使您的构建时间大大缩短。您可以在Gradle上找到的其他出色的性能功能包括:
Java类的增量编译
Java的编译避免
对增量子任务使用AP
编译器守护程序还可以使编译速度更快
在管理依赖项时,Gradle和Maven都可以处理动态和传递性依赖项,以使用第三方依赖项缓存并读取POM元数据格式。您还可以通过中央版本控制定义声明库版本并强制执行中央版本控制。两者都从构件库下载可传递依赖项。Maven具有Maven Central,而Gradle具有JCenter,您也可以定义自己的私人公司存储库。如果需要多个依赖项,Maven可以同时下载这些依赖项。
但是,Gradle在涉及API和实现依赖项以及固有地允许并发安全高速缓存方面取胜。它还将存储库元数据与缓存的依赖项保持在一起,确保使用同一缓存的两个或多个项目不会相互覆盖,并且具有基于校验和的缓存,并且可以将缓存与存储库同步。此外,Gradle与IVY元数据兼容,允许您定义自定义规则以为动态依赖项指定版本,并解决版本冲突。这些在Maven上不可用。
您只能在Gradle上找到的其他依赖项管理功能包括:
Gradle还为您提供了使用复合构建的更轻松时间,它使您可以使用临时和永久复合构建,以及组合不同的构建并将复合构建导入到IntelliJ IDEA的Eclipse中。
就执行模型而言,两者都有任务组和描述。两者都使您只能构建指定的项目及其依赖项。但是,Gradle具有完全可配置的DAG,而对于Maven,一个目标只能附加到另一个目标。多个目标采用有序列表的形式。Gradle还允许任务排除,传递排除和任务依赖推断。Gradle还具有任务排序和完成器等高级功能。
管理构建基础结构是Gradle的另一个优势,因为它使用接受自动预配置的包装器,而使用Maven,您需要扩展以支持自我配置构建。Gradle还使您能够配置基于版本的构建环境,而无需手动设置它们。它还允许自定义分发。
在对Ant,Gradle和Maven进行比较时,Naresh Joshi在Programming Mitra上比较了创建构建脚本所需的代码,该构建脚本进行编译,执行静态分析,运行单元测试并创建JAR文件。
这是使用Maven实现此目标所需的代码:
4.0.0
com.programming.mitra
java-build-tools
jar
1.0
junit
junit
4.11
org.apache.maven.plugins
maven-compiler-plugin
2.3.2
要运行创建JAR文件的Maven目标,您需要执行以下操作
mvn package
注意,使用此代码可以重新设置参数,但不指定必须执行的任务。您可以添加插件(如Maven CheckStyle、FindBugs和PMD)来将静态分析作为单个目标与单元测试一起执行,但是您需要指定custom check样式配置的路径,以确保它在出错时失败,使用的代码是
org.apache.maven.plugins
maven-checkstyle-plugin
2.12.1
config/checkstyle/checkstyle.xml
true
true
check
org.codehaus.mojo
findbugs-maven-plugin
2.5.4
check
org.apache.maven.plugins
maven-pmd-plugin
3.1
check
要运行目标以实现此目标,请执行以下操作:
mvn verify
它需要相当多的XML代码来完成一些基本的和常见的任务,因此,Maven中的项目如果有大量的任务和依赖项,就会产生由数百到数千行代码组成的pom.xml文件。为了进行比较,这里有一个构建示例。级代码实现了类似的结果
apply plugin:'java'
apply plugin:'checkstyle'
apply plugin:'findbugs'
apply plugin:'pmd'
version ='1.0'
repositories {
mavenCentral()
}
dependencies {
testCompile group:'junit', name:'junit', version:'4.11'
}
这段代码比较短,还引入了一些有用的任务,上面的Maven代码没有涉及这些任务。对于Gradle可以使用当前配置运行的任务列表,执行以下操作:
gradle tasks --all
总体而言,这两种工具各有优缺点。
使用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。
有关更多阅读和更多信息(包括有用的教程),请访问以下资源:
The Gradle build system- Tutorial
Getting Started With Gradle
Maven in 5 Minutes
Maven for building Java applications – Tutorial
Maven Tutorial
Gradle VS Maven 比较(官方文档翻译)
Gradle和maven都是构建工具,其他构建工具make,ant,他们的比较如下图
本篇文章翻译自一篇Gradle vs. Maven ,同时小编在此基础上加上了自己的拓展和总结,希望对您有有所帮助.