gradle和maven对比

Gradle作为一款基于Groovy语言的构建工具,已经吸引众多的ant,maven使用者转投gradle的怀抱,和Gradle相比,ant显得冗余复杂,maven显得有些死板落后,而gradle基于DSL语法,特点明显:简洁、灵活、可读性强。Gradle和maven有很多相似点,gradle充分考虑到maven库的价值,在jar包管理上完全支持maven Repository,很多属性乍眼一看就能反应过来maven中对应的是什么标签,大大降低maven到gradle的迁移难度,并在构建方面改善了很多maven的不足,,同时,gradle对比maven更好的面向ant用户,使用maven时,虽然能通过plugin来跑ant的命令,但是maven在任务实现主要靠的是插件以及自身的固定框架,Gradle在定义任务方面思想与ant非常相似,做了很好的集成。下面会主要介绍gradle在配置方面与maven的异同处,以及Gradle比较实用的命令。

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需要在每个依赖加上 和标签或者在plugin里单独增加编译路径。而Gradle只需要加上

compile fileTree(dir: 'libs', include: '*.jar')

在多个路径下时:
j

arTree = 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 }
}

这个task可以显示出当前项目下所有用于 compile 的 jar。
常用命令:

  1. Task可以通过全名调用、前缀调用或首字母调用。
  2. gradle XXX -s/ gradle XXX -S
    当执行task有错误时,可以使用-s来查询详细的错误堆栈,-S输出全部堆栈信息。
  3. -continue
    比如执行gradle clean install -continue,即使遇到某些task失败也不会停止后续task的执行,一次性得到所有的构建错误。
  4. Gradle tasks / Gradle tasks all
    显示出当前目录下所有的task以及显示出task之间的依赖关系。

最后,Gradle不足的地方就在于使用了groovy语言,熟悉一个新语言是需要学习成本的,而ant和maven都是使用xml来实现,不过groovy被称为是没有类型的java,对于java学习者来说还是容易接受的,这样提高了gradle在实际应用中的可行性。作为一个构建工具,Gradle能算得上非常好的选择。对于Gradle的一些简单介绍,希望能对大家有所帮助。

5. 与docker的集成

Docker 在构建镜像时有分段缓存机制,鼓励用户编写 Dockerfile 时充分利用分段构建(先下载依赖,再编译项目)。这一点 Maven 很好做到,因此官方在介绍最佳实践的文章中也是以 Maven 入手,从项目的编译到运行都在 Docker 容器中完成。
Gradle 则有自身的一套缓存机制,放在 Docker 中则适得其反,无法被 Docker 有效缓存,导致构建效率低下(无法像 Maven 一样一个 POM 完成全部依赖的静态解析,且缓存机制是动态的,想静态又得用离线模式)。因此 Gradle 推荐的做法是在 build.gradle 中通过插件构建 Docker 镜像,而不是在容器中编译。实际上官方更推荐使用专门的 Gradle Build Server / Build Cache Server。

Gradle项目打包并Docker部署

6. 在shell中传入参数

向Gradle:

shell中

./gradlew collectSDK -Pflavor=gionee

gradle脚本

def flavor = project.hasProperty('flavor') ? flavor : "common"

maven相对麻烦,不细说

刘持老师的博文《maven到Gradle,一些对比和分享》

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiegwei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值