DPE 大学现已上线!了解更多关于 Gradle Build Tool、Gradle Build Scan、Develocity 和生态系统的信息 关闭 - Gradle 构建系统

Gradle 与 Maven 对比

以下是 Gradle 和 Apache Maven 在灵活性、性能、用户体验和依赖管理方面的主要差异总结。这并非详尽无遗,但您可以查看 Gradle 功能列表Gradle 与 Maven 性能对比以了解更多信息。

此 GIF 展示了使用 Maven 和 Gradle(无构建缓存)对 Apache Commons Lang 库进行并排的 čistá 构建。您可以在此处查看构建。

灵活性

Google 选择 Gradle 作为 Android 的官方构建工具,并非因为构建脚本是代码,而是因为 Gradle 的建模方式在最根本的层面上是可扩展的。Gradle 的模型还使其能够用于 C/C++ 的原生开发,并可以扩展以覆盖任何生态系统。例如,Gradle 设计时考虑到了使用其 Tooling API 进行嵌入。

Gradle 和 Maven 都提供了“约定优于配置”的原则。然而,Maven 提供了一个非常僵化的模型,使得定制变得繁琐,有时甚至不可能。虽然这使得理解任何给定的 Maven 构建变得更容易(只要您没有特殊要求),但这也使其不适用于许多自动化问题。相比之下,Gradle 是为被赋能且负责任的用户而设计的。

性能

缩短构建时间是实现*更快交付*最直接的方式之一。Gradle 和 Maven 都采用了某种形式的并行项目构建和并行依赖解析。最大的区别在于 Gradle 的工作避免和增量构建机制。使 Gradle 比 Maven 快得多的三大功能是:

  • 增量构建 — Gradle 通过跟踪任务的输入和输出来避免重复工作,只运行必要的任务,并且在可能的情况下只处理已更改的文件
  • 构建缓存 — 重用任何其他具有相同输入的 Gradle 构建的输出,包括在不同机器之间。
  • Gradle 守护进程 — 一个长期运行的进程,将构建信息“热”保存在内存中。

这些以及更多性能特性使得 Gradle 在几乎所有场景下都至少比 Maven 快两倍(在使用构建缓存的大型构建中快 100 倍),具体可参阅此 Gradle 与 Maven 性能对比

注意: Gradle 和 Maven 用户都可以利用 Develocity 中提供的构建缓存技术。Gradle 用户通常会体验到约 50% 的额外构建时间缩短,而 Maven 用户通常会体验到约 90% 的缩短。观看此视频以了解更多关于 Develocity Maven 构建缓存技术和商业案例的信息。

用户体验

Gradle build script written with Kotlin in an IDE

Maven 的历史更悠久,意味着其在 IDE 中的支持对许多用户来说更好。然而,Gradle 的 IDE 支持也在迅速改进。例如,Gradle 现在有一个基于 Kotlin 的 DSL,它提供了更好的 IDE 体验。Gradle 团队正在与 IDE 制造商合作,以大幅改善编辑支持——敬请关注更新。

尽管 IDE 很重要,但大量用户更喜欢通过命令行界面执行构建操作。Gradle 提供了一个现代化的 CLI,具有 `gradle tasks` 等可发现性功能,以及改进的日志记录和命令行自动补全

最后,Gradle 提供了一个交互式的基于 Web 的 UI,用于调试和优化构建:Build Scan™。这些也可以在本地部署,使组织能够收集构建历史并进行趋势分析,比较构建以进行调试,或优化构建时间。

Build Scan™

依赖管理

两种构建系统都提供了从可配置的仓库解析依赖的内置功能。两者都能够本地缓存依赖并并行下载它们。

作为库的使用者,Maven 允许覆盖依赖,但只能通过版本。Gradle 提供可定制的依赖选择替换规则,这些规则可以一次性声明并处理整个项目中的不期望的依赖。这种替换机制使 Gradle 能够将多个源项目一起构建以创建复合构建

Maven 的内置依赖范围很少,这在常见场景(如使用测试固件或代码生成)中迫使模块架构变得笨拙。例如,单元测试和集成测试之间没有分离。Gradle 允许自定义依赖范围,这提供了更好建模和更快的构建。

Maven 的依赖冲突解决机制采用最短路径,这会受到声明顺序的影响。Gradle 进行完整的冲突解决,选择在依赖图中找到的依赖的最高版本。此外,通过 Gradle,您可以将版本声明为*严格的*,这使它们能够优先于传递性版本,从而可以降级依赖

作为库的生产者,Gradle 允许生产者声明 `api` 和 `implementation` 依赖,以防止不期望的库泄漏到使用者的类路径中。Maven 允许发布者通过可选依赖提供元数据,但仅作为文档。Gradle 完全支持功能变体和可选依赖。

后续步骤

我们建议您更深入地了解 Gradle 的功能,或从以下资源开始。