gradle和maven的区别是什么呢?不知道的小伙伴来看看小编今天的分享吧!
1、基础配置信息区别:
maven使用.pom文件,基于XML,gradle使用.gradle文件,基于Groovy,gradle去掉maven中需要固定配置的groupId,artfactId,package等基本参数,通过 apply plugin: 'java',apply plugin: 'war'来表示打包方式,也提供sourceCompatibility,version等一些实用的标签。
2、依赖管理区别:
Gradle的jar包管理支持maven下Repository方式,也支持Ant的Ivy方式,由于maven的Repository已经非常成熟,gradle在兼容Repository做得非常方便,定义maven的repository:
mavenLocal() :maven 本地库
mavenCentral() : maven 远程库
mavenRepo urls: 自定义库路径
maven通过groupId、name和version到配置的Repository里寻找指定依赖中的Jar包。Gradle的生命周期更为复杂,但也支持Maven依赖中的构建生命周期,compile、runtime、testCompile和testRuntime分别对应项目不同阶段的依赖。 并且还简化maven的配置命令。
Maven:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
Gradle:
dependencies { testCompile group:'junit', name: 'junit', version '4.11'}
或者
dependencies { testCompile 'junit:junit:4.11' }
如果需要引用自己lib目录下jar包,maven需要在每个依赖加上<scope> 和<systemPath>标签或者在plugin里单独增加编译路径。而Gradle只需要加上
compile fileTree(dir: 'libs', include: '*.jar'),在多个路径下时:
jarTree = fileTree(dir: 'libs', include: '*.jar')
rootTree = new File(rootProject.rootDir, 'libs').getAbsolutePath()
jarTree += fileTree(dir: rootTree, include: '*.jar')
compile jarTree
在依赖相关的命令行方面,gradle与maven比较相似,maven常用的分析依赖命令包括:
mvn dependency:analyz查看依赖;
mvn dependency:tree 查看项目直接和传递依赖;
mvn help:effective-pom查看有效的pom;
在gradle中使用gradle dependencies 可以查看项目中包的依赖关系。加上-configuration来查看指定阶段的依赖情况,还可以-dependency来查看指定jar的依赖情况。
3、多项目管理区别:
实际使用中,往往需要管理的都不是单单一个项目,maven使用依赖,继承,组成的概念,在父模块指定自己的子模块,并且准备一些各个子模块公用的资源,如插件,配置信息等等。将打包的模块与实现具体功能的模块分开的做法来管理多个项目。Gradle在这一方面做得更加清楚,划分更明确,学习gradle的多项目管理也很容易,在eclipse中安装完gradle插件之后,新建一个Gradle工程,选择flat-java-multiproject,生成的工程就是多项目管理一个示例。
Gradle通过settings.gradle文件来指定工程的子项目,在构建的初始化阶段(Initialization),Gradle会根据settings.gradle 文件来判断有哪些子项目被include到了构建中,并为每一个子项目初始化一个Project对象,在构建脚本中通过project(‘:sub-project-name’)来引用子项目对应的Project对象。关于多项目配置有非常多,因此就简述一下常用的配置共享以及配置独享。
Allprojects属性,返回该Project对象以及其所有子项目。
subprojects属性,返回该Project所有子项目。
project(‘:sub-project-name’)来设置对应的子项目的配置。
configure(subprojects.findAll {it.name.contains('XXX')})来找符合要求的子项目。
在子项目的build.gradle文件里添加自己独有的配置。
4、任务机制区别:
Maven相对于ant相比仅仅通过plugin提供任务机制,相比而言自由度小而且很难扩展,每定义一个功能都需要写一个插件,Ant中使用tagret标签的echo来指定命令,gradle使用groovy语言,自带task概念,与ant使用的build文件更加接近。一个Task表示一个逻辑上的执行单元。
Gradle编写task的方式有很多,网上也能很容易搜索到相关的例子,在此简述有关task的一些实用命令以及自己一个常用的task:
Task listJars(description: 'Display compile jars.') << {
configurations.compile.each { File file -> println file.name }
以上就是小编今天的分享了,希望可以帮助到大家。
Gradle大战Maven,胜负已分?
"I can’t understand why people are frightened of new ideas. I’m frightened of the old ones." — John Cage
"我不明白为什么人们害怕新想法。 我害怕那些旧的。" - 约翰凯奇。
勇敢迈出舒适区,去冒险吧!
Gradle渐渐地火了起来,但是大部分人还在使用maven,本文将对Gradle和Maven进行全面的比较,大家可以据此作为选型比较的依据。
Maven和Gradle都属于“构建工具”,都是用来自动化工作,并把我们的源码编译成我们要发布的构件而存在。
历史maven初始版本诞生于2004年,Gradle诞生于2008年,Maven诞生时间更早,但二者都拥有悠久的历史,它们都拥有优秀成熟的生态。
maven初始版本诞生于2004年
gradle初始版本诞生于2008年
性能Gradle引入了 Maven中缺少的几个性能优化,以提高构建性能。这也是Spring、Spring Boot源码使用Gradle替换Maven的主要原因。
Gradle 构建缓存在本地重用Gradle任务的输出,并在机器之间共享任务输出。 在许多情况下,这将加快平均构建时间。
构建缓存在分支之间切换时也非常有用,因为先前构建的输出被保留并且不必重新创建。 性能节省与上面的缓存构建相当,在测试项目中,Gradle 比 Maven 快 17 到 100 倍。
在小型的多项目编译中,Gradle 在干净构建下速度快 2-3 倍,增量更改速度快 7 倍,缓存 Gradle任务输出时速度快 14 倍。
gradle和maven速度比较
在中型的多项目编译中,Gradle 在干净构建下速度快4-5 倍,增量更改速度快 40 倍,缓存 Gradle任务输出时速度快 13 倍。
在大型大型单体式项目中,Gradle在干净构建下速度快 2-3 倍,增量更改速度快 7 倍,缓存Gradle任务输出时速度快 3 倍。
代码Maven使用的是基于xml的pom.xml,Gradle使用基于Groovy语言的build.gradle。我们比较一下两个相同功能的Spring Boot程序,分别使用Maven和Gradle的区别。
build.gradle和pom.xml代码行数比较
由图可以看出,相同情况下,build.gradle是33行代码,pom.xml是69行代码。当然这主要的原因是xml本身就是一门很啰嗦的表意语言。也因此,用xml作为配置、协议也越来越少。
由图也可以看出Gradle比Maven易读性更强且更易维护!
功能功能 | Maven | Gradle |
构建 | ||
编译Java应用 | 有 | 有 |
用插件构建其他语言 | 有 | 有 |
不用插件构建其他语言 | 无 | 有 |
性能 | ||
并行编译 | 有 | 有 |
增量构建 | 无 | 有 |
增量编译 | 无 | 有 |
作为守护进程在后台运行 | 无 | 有 |
可用性 | ||
无需安装 | 否 | 是 |
动态控制台 | 无 | 有 |
定制 | ||
支持多模块 | 有 | 有 |
支持第三方插件 | 有 | 有 |
支持自定义插件 | 有 | 有 |
支持动态构建逻辑 | 无 | 有 |
从表中可以看出,Gradle的功能是比Maven要更丰富的。
流行度从各类统计数据来看,Maven使用的流行度、市场占有率是有绝对的领先优势的。但是这也不能说明太多的问题,当年的ie、xp系统、诺基亚手机也都是市场的霸主。
个别的统计有显示Gradle有领先的结果,但这不能说明Gradle真正领先。如由OpenLogic发布的《2022年度开源报告显示》:
结论由上述比较,我们发现Gradle有明显于Maven的优势。我提出下面的建议:
1、新项目尝试使用Gradle来构建!
2、尝试迁移Maven的老项目将其使用Gradle构建。(如:)
不愿迁移的理由很多:
1、对于Maven很熟悉了,不用迁移到新的工具!
2、又要学习一个新东西,卷不动了!
我觉得无论作为什么样的职业,对新的东西要保持敏锐的感知和学习,不要停留在自己舒适的区域,无论Gradle有没有那么优秀,或者有没有那么多问题,我们要坚持尝试一下。
最后送给大家一句话:
"I can’t understand why people are frightened of new ideas. I’m frightened of the old ones." — John Cage
"我不明白为什么人们害怕新想法。 我害怕那些旧的。" - 约翰凯奇。
勇敢迈出舒适区,去冒险吧!