下面总结了Gradle和Apache Maven之间的主要区别:灵活性,性能,用户体验和依赖管理。这并不意味着要详尽无遗,但是您可以查看Gradle功能列表以及Gradle与Maven性能比较以了解更多信息。此GIF显示了使用Maven和Gradle(无构建缓存)的Apache Commons Lang库的并行完整构建。您可以在此处查看此构建构建扫描

灵活性

Google选择Gradle作为Android官方构建工具 ; 不是因为构建脚本是代码,而是因为Gradle以最基本的方式可扩展的方式进行建模。Gradle的模型还允许将其用于C / C ++的本机开发,并且可以扩展为涵盖任何生态系统。例如,Gradle在设计时会考虑使用其Tooling API进行嵌入。
Gradle和Maven都提供了配置约定。但是,Maven提供了一个非常僵化的模型,使定制变得乏味,有时甚至是不可能的。尽管这可以使您更容易理解任何给定的Maven构建,但是只要您没有任何特殊要求,它也就不适合许多自动化问题。另一方面,Gradle的构建考虑了授权和负责任的用户。

性能

14.790.6850.54826.18525.8524.083Clean build with testsClean build (cacheenabled) with testsCompile single changeduration (s)051015202530Gradle 5.4Maven 3.6Apache Commons Lang 3 build time
缩短建造时间是加快出货速度的最直接方法之一。Gradle和Maven都采用某种形式的并行项目构建和并行依赖项解析。最大的差异是Gradle避免工作和增加工作量的机制。使Gradle比Maven快得多的前3个功能是:

  • 增量性 -Gradle通过跟踪任务的输入和输出并仅运行必要的内容,并且仅在可能时处理已更改的文件,从而避免了工作。
  • 构建缓存 -重用具有相同输入的其他Gradle构建的构建输出,包括在机器之间。
  • Gradle Daemon —一个长期存在的过程,可将构建信息“热”存储在内存中。

Gradle与Maven的性能对比中,这些和更多的性能功能使Gradle在几乎每种情况下的速度至少是其两倍(对于使用构建缓存的大型构建而言,则是100倍)。

用户体验

Gradle vs Maven比较 - 图1
Maven的任期较长,这意味着它对许多用户的IDE支持更好。但是,Gradle的IDE支持继续迅速提高。例如,Gradle现在具有基于Kotlin的DSL,可提供更好的IDE体验。Gradle团队正在与IDE开发商合作,以使编辑支持变得更好-随时关注更新。
尽管IDE很重要,但是许多用户还是喜欢通过命令行界面执行构建操作。Gradle提供了一个现代的CLI,具有可发现性功能,例如“ gradle task”(渐变任务),以及改进的日志记录和命令行完成功能
最后,Gradle提供了一个基于Web的交互式UI来调试和优化构建:构建扫描。这些还可以在内部托管,以允许组织收集构建历史记录并进行趋势分析,比较构建以进行调试或优化构建时间。
Gradle vs Maven比较 - 图2

依赖管理

两种构建系统都提供了内置功能,可以解决来自可配置存储库的依赖关系。两者都可以在本地缓存依赖项并并行下载它们。
作为库的使用者,Maven允许重写一个依赖项,但只能按版本。Gradle提供了可自定义的依赖关系选择替换规则,这些规则可以声明一次,并在项目范围内处理不需要的依赖关系。这种替换机制使Gradle可以一起构建多个源项目以创建复合构建
Maven具有很少的内置依赖项作用域,这些作用域在常见的情况下(例如使用测试夹具或代码生成)迫使笨拙的模块体系结构。例如,单元测试和集成测试之间没有分隔。Gradle允许自定义依赖项作用域,它提供了更好的建模和更快的构建。
Maven依赖关系冲突解决方案以最短路径工作,该路径受声明顺序影响。Gradle解决了所有冲突,选择了图中最高版本的依赖项。另外,使用Gradle可以将版本严格声明为允许版本优先于可传递版本,从而降级依赖项
作为库生产者,Gradle允许生产者声明“ api”和“ implementation”依赖项,以防止有害的库泄漏到使用者的类路径中。Maven允许发布者通过可选的依赖项提供元数据,但仅作为文档提供。Gradle完全支持功能变体和可选依赖项