众所周知,Grandle 和 Maven 都是构建工具,那两者有什么区别呢?我们将从灵活性,性能,用户使用体验,依赖管理这几个方面来进行比较。
本篇文章参考 Gradle 官网文章, Gradle vs Maven Comparison ,有需要的同学直接跳转原文进行查阅。
灵活性
Gradle 和 Maven 都是约定优于配置的构建工具。
但是,Maven 是一种非常严格的构建工具,对其进行定制化开发并不容易(有时无法做到)。虽然这让 Maven 的构建更容易理解,如果你没有任何特殊要求的话完全可以使用 Maven。这也意味着 Maven 不适合许多自动化问题。
仔细想想确实如此,笔者待过一家公司,虽然也是使用 Maven 进行管理,但是对于自动化构建打包却是使用 Ant 来解决。
从这方面来说,Gradle 是完全是为有能力和负责任的用户而准备的一种构建工具(只要用户做得到,完全可以自己写脚本进行构建)。Google 也选择了 Gradle 作为安卓开发的构建工具。Gradle 的模型还允许它用于 C/C++ 的原生开发,并且可以扩展到任何生态系统。
性能
缩短构建时间是加快交付速度的最直接办法之一。Gradle 和 Maven 都使用并行的项目构建和并行的依赖解决。两者间最大的不同是,Gradle 使用的技术避免了很多增量工作(三个方面):
- 增量性:Gradle 通过跟踪任务的输入和输出,仅运行必要的任务,并在可能的情况下仅处理更改的文件,避免了不必要的工作。
- 构建缓存:对于构建输出的缓存,直接重用。
- Gradle 守护进程:一个长期存在的进程,可以在内存中保存构建信息(下次构建不用另开新的进程,而是使用之前的进程来进行构建,提高性能)。
正是这些改进,使 Gradle 在几乎所有场景中都至少快两倍(使用构建缓存的大型构建快 100 倍)。 直接上图:
Gradle 官方甚至专门写了一篇文章来比较两者之间的性能,感兴趣的可直接前往:Gradle vs Maven performance comparison.
用户使用体验
Maven 由于有很长的使用时间了,所以对于 IDE 的支持对于用户来说明显做的比 Gradle 更好。在 IDEA 上的使用体验也更好。但是 Gradle 也在快速迭代改善了,比如:Gradle 支持 Kotlin-based DSL 以提供更好的 IDE 使用体验,同时 Gradle 的团队也在和 IDE 提供商合作了,可以期待下后面更好的体验。
Gradle 的 DSL 领域特定语言一般支持两种:Groovy 和 Kotlin。
尽管 IDE 很重要,但是更多开发者还是倾向于使用命令行,而在命令行工具上,Gradle 提供了一个现代化的 CLI 客户端(改进的日志记录和命令行完成的功能)。
甚至 Gralde 还提供了一个基于 web 的 UI 界面:Build Scan™。
依赖管理
Gradle 和 Maven 都提供了从可配置的存储库(也就是本地仓库、远程仓库)解析依赖项的内置功能。两者都能够在本地缓存依赖项并并行下载它们。
这里提一嘴,Gradle 可以使用 Maven 的已有仓库。
作为库(library,这里的库理解为包,比如仓库中的 jar 包)的使用者:
- Maven 只能通过版本 version 覆盖依赖项。而 Gradle 提供了可定制的依赖项选择和替换规则,只需要一次声明就能在整个项目中处理不需要的依赖项。
- Maven 的内置依赖范围很少,比如依赖范围中无法分离单元测试和集成测试。而 Gralde 提供了自定义的依赖范围,可以更好更快的进行构建。
- Maven 对于依赖冲突的解决是使用最短路径,可能会受声明顺序的影响。而 Gradle 完全解决了依赖冲突。默认是使用最新版本解决依赖冲突。另外,你也可以自己指定版本,优先级高于传递版本,使传递依赖降级。
作为库(library,这里的库理解为包)的生产者:
Gradle 允许生产者声明 api 和 implementation 依赖项,以防止不需要的库泄露到消费者的类路径中。Maven 允许发布者通过可选依赖项提供元数据,但仅作为文档(optional dependencies)。Gradle 完全支持功能变体和可选依赖项(feature variants and optional dependencies.)。
以上为 Gradle 官网的理论知识,在文章的结尾,举例几个实际使用上的差别。
实际使用差别示例
- 引入依赖
maven:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.0</version>
</dependency>
gradle:
implementation group: 'org.mybatis.spring.boot', name: 'mybatis-spring-boot-starter',version: '2.3.0'
- Maven 的核心文件是
pom.xml,Gradle 的核心文件是build.gradle。 - 详细的 Gradle 使用请参考 Gradle 官网或其他博客。(后续会写)