以下从灵活性、性能、用户体验和依赖管理几个方面对Gradle和Maven进行比较,更多详细内容可以访问Gradle功能列表和Gradle与Maven的性能对比。
该图展示了分别使用Gradle和Maven构建Apache Commons Lang library的情况,可以查看这里了解Gradle的构建详情。
灵活性
谷歌选择Gradle作为Android官方构建工具,不是因为它的构建脚本是groovy代码,而是因为Gradle是以一种最基本的可扩展的方式建模的。Gradle的模型还允许使用C/C++进行本地开发,并且可以扩展到其他生态系统,例如,Gradle的设计考虑了使用它的Tooling API进行嵌入。
Gradle和Maven都提供了约定优于配置的概念,然而,Maven提供了一个非常严格的模型,使得定制变得乏味,有时甚至变得不可能,尽管这让你更容易理解任何给定的构建,但只要你没有任何特别的要求,它也不适合处理许多自动化问题。另一方面,Gradle是在充分授权和负责任的用户基础上构建的。
性能
减少构建时间是加快交付速度最直接的方式之一。Gradle和Maven都采用某种形式的并行项目构建和依赖解析,最大的区别在于Gradle的工作回避与增量机制。Gradle比Maven快的最主要的三个特性:
- 增量工作方式。Gradle通过跟踪任务的输入输出来避免不必要的工作,并且只处理可能被更改的文件;
- 构建缓存。对于具有相同输入的构建,可以复用其他构建的输出,即使是在不同的机器上;
- Gradle的守护进程。在内存中长期驻守一个进程来保持热点构建信息。
在Gradle与Maven的性能对比中,以上这些以及其他一些特性使得Gradle几乎在每个场景中都性能都要高一倍,对于使用的构建缓存的大型构建,性能甚至要高100倍。
用户体验
Maven由于对IDE的友好支持,使得其在用户中有广泛的使用。但是,Gradle也在不断完善对各种IDE的支持,例如,Gradle有基于Kotlin的DSL,提供了更好的IDE体验。Gradle团队正在与IDE开发商合作,以提供更好的编辑支持,请关注这里。
尽管IDE很重要,仍然有很多用户喜欢使用命令行来构建,Gradle提供了一个现代的命令行工具,它具有可发现功能,如‘gradle tasks’,以及改进的日志记录和命令补全功能。
最后,Gradle提供了一个可交互的web UI(build scans),用于调试和优化构建。这些也可以在内部托管,以允许团队收集构建历史,分析构建趋势,比较构建进行调试和优化构建时间。
依赖管理
Gradle和Maven都内建了从配置仓库解析依赖关系的功能,都能将依赖项缓存到本地并且可以并行下载。
作为库消费者,Maven允许覆盖依赖项,但只能根据依赖项的版本来覆盖。Gradle提供了可自定义的选择和替换规则,这意味着,我们在项目中只需要声明一次就可以全局排除不想要的依赖项,这种机制使得Gradle可以完成包含多个项目的复合构建。
Maven几乎没有内置的依赖范围管理,这使得在测试或生成代码等常见场景中的模块结构不够友好,比如,单元测试和继承测试之间没有分离。Gradle支持自定义依赖范围,这提供了更好的模块结构和更快的构建。
作为库生产者,Gradle允许生产者声明“api”和“implementation”之间的依赖关系,以避免不需要的库泄漏到消费者的classpath中。Maven则是允许发布者通过可选的依赖项提供元数据。
下一步做什么
建议进一步了解Gradle的功能,或者从以下这些主题开始: