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

灵活性
Google 选择 Gradle 作为 Android 的官方构建工具;并非因为构建脚本是代码,而是因为 Gradle 的建模方式使其在最根本的层面上具有可扩展性。 Gradle 的模型还使其可以用于 C/C++ 的原生开发,并且可以扩展到涵盖任何生态系统。 例如,Gradle 在设计时就考虑到了嵌入,它使用了 Tooling API。
Gradle 和 Maven 都提供了约定优于配置。 然而,Maven 提供了一个非常僵化的模型,这使得自定义变得乏味,有时甚至不可能。 虽然这可以使理解任何给定的 Maven 构建更容易(只要您没有任何特殊要求),但它也使其不适用于许多自动化问题。 另一方面,Gradle 的构建考虑到了有权力和负责任的用户。
性能
缩短构建时间是更快交付的最直接方法之一。 Gradle 和 Maven 都采用某种形式的并行项目构建和并行依赖项解析。 最大的区别在于 Gradle 的工作避免和增量机制。 使 Gradle 比 Maven 快得多的前 3 个特性是
- 增量构建 — Gradle 通过跟踪任务的输入和输出来避免工作,并且只运行必要的任务,并且尽可能只处理更改的文件。
- 构建缓存 — 重用具有相同输入的任何其他 Gradle 构建的构建输出,包括机器之间。
- Gradle Daemon — 一个长期存在的进程,可将构建信息“热”存储在内存中。
这些以及更多性能特性使 Gradle 在几乎所有场景下都至少快两倍(对于使用构建缓存的大型构建快 100 倍),如本Gradle 与 Maven 性能对比所示。
注意: Gradle 和 Maven 用户都可以利用 Develocity 中提供的构建缓存技术。 Gradle 用户通常会额外体验到约 50% 的构建时间缩短,而 Maven 用户通常会体验到约 90% 的缩短。 观看此视频以了解有关 Develocity Maven 构建缓存技术和商业案例的更多信息。
用户体验

Maven 较长的发展历史意味着它通过 IDE 获得的支持对许多用户来说更好。 然而,Gradle 的 IDE 支持仍在快速改进。 例如,Gradle 现在有一个基于 Kotlin 的 DSL,它提供了更好的 IDE 体验。 Gradle 团队正在与 IDE 制造商合作,以使编辑支持更好 — 敬请关注 以获取更新。
虽然 IDE 很重要,但大量用户更喜欢通过命令行界面执行构建操作。 Gradle 提供了一个现代化的 CLI,它具有诸如 `gradle tasks` 之类的发现功能,以及改进的日志记录和命令行补全。
最后,Gradle 提供了一个交互式的基于 Web 的 UI,用于调试和优化构建:Build Scan™。 这些也可以在本地部署,以允许组织收集构建历史记录并进行趋势分析、比较构建以进行调试或优化构建时间。

依赖管理
这两种构建系统都提供了内置功能,可以从可配置的存储库解析依赖项。 两者都能够将依赖项缓存在本地并并行下载它们。
作为库的使用者,Maven 允许覆盖依赖项,但只能按版本覆盖。 Gradle 提供了可自定义的依赖项选择和替换规则,这些规则可以声明一次并处理整个项目中不需要的依赖项。 这种替换机制使 Gradle 能够将多个源项目构建在一起以创建复合构建。
Maven 只有少数内置的依赖项作用域,这在常见的场景(例如使用测试 fixtures 或代码生成)中强制使用笨拙的模块架构。 例如,单元测试和集成测试之间没有分离。 Gradle 允许自定义依赖项作用域,这提供了更好建模和更快的构建。
Maven 依赖项冲突解决使用最短路径,这会受到声明顺序的影响。 Gradle 执行完整的冲突解决,选择图中找到的依赖项的最高版本。 此外,使用 Gradle,您可以将版本声明为严格,这允许它们优先于传递版本,从而允许降级依赖项。
作为库的生产者,Gradle 允许生产者声明 `api` 和 `implementation` 依赖项,以防止不需要的库泄漏到消费者的类路径中。 Maven 允许发布者通过可选依赖项提供元数据,但仅作为文档。 Gradle 完全支持功能变体和可选依赖项。
后续步骤
我们建议您更深入地了解 Gradle 的功能,或从以下资源开始。