导读:Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。面向Java应用为主。当前其支持的语言限于Java、Groovy、Kotlin和Scala,计划未来将支持更多的语言。
Java生态体系中有三大构建工具:Ant、Maven和Gradle。
时至今日,Ant几乎销声匿迹,Maven已经成为行业标准。但Maven繁冗XML的配置,缺乏灵活性,学习曲线陡峭等缺点,给了Gradle这个后起之秀机会。
Gradle具有构建结构的广泛模型,可以了解每个任务的输入和输出及其相互依赖性。这种建模的好处是,它允许任务并行运行,同时也可以增量,缓存或完全避免。换句话说,Gradle旨在最小化构建任何给定更改并并行执行必需的工作所需的工作量。
在 Spring Boot 团队在 2.3.0版本中考虑由 Maven 切换到 Gradle 的主要原因为了减少构建项目所需的时间。在开发和测试过程中,等待构建完成所花费的时间增加了修复错误和实现新功能所花费的时间。
为了解决这个问题,团队曾尝试利用 Maven 对并行构建的支持。由于 Spring Boot 构建的复杂性,特别是对 Invoker 插件的使用,尝试失败。通过将构建分为四个部分来解决 CI 问题。首先构建项目的主要核心,然后并行构建三个独立的部分。但 CI 的构建仍需要一个小时或更长时间。此外,由于针对的是模块化 CI 构建,因此并没有使得开发人员本地构建效率有所改变。
Spring Boot 团队在其他利用 Gradle 作为构建工具的 Spring 项目中看到了 Gradle 的增量和并行构建以及在第三方项目中看到了 Gradle 的构建缓存的好处。希望通过使用 Gradle 为 Spring Boot 构建获得类似的好处。
Gradle 具有非常灵活的构建模型,并且可以定义每个任务的输入和输出及其相互依赖性。这种构建模型的好处是,它允许任务并行运行,同时也可以增量、缓存或完全跳过。换句话说,Gradle 可以最小化的执行必要的 CI 任务。虽然可以使用了 Gradle Enterprise 的 Maven 支持,我们也可以享受构建缓存和跳过的好处。但是要充分享受这四个方面的好处,必须尝试切换到 Gradle。
虽然现有 Gradle 生态系统对 Spring Boot 构建几乎空白,需要从头通过编写很多通用的 gradle 插件来应用到 Spring Boot,但迁移到 Gradle 的提交从代码库中删除了近 9500 行。
最终,Spring Boot团队对迁移Gradle的过程以及减少的构建时间感到非常满意。之前,不管在CI和开发人员自己的计算机上,基于Maven的完整构建都需要一个小时或更长时间。基于 Maven 的完整构建都需要一个小时或更长时间。而基于 Gradle 的平均成功构建时间为 9 分 22 秒,如以下截图所示:
简洁、灵活、可读性强,已经成了Gradle身上的鲜明的标签,而“约定优于配置”是Maven的核心思想。
以前要靠编写一个Maven插件才能完成的工作,在Gradle上,几行配置,几句脚本就能可以轻松搞定。但Gradle的脚本语言Grovvy却是一大障碍,几乎百分之百的Java开发者都熟悉Maven的配置语言XML,但Grovvy就未必熟悉了。之所以Maven依然流行,很大的原因就是95%以上的场景,其实是不需要扩展工作的。一旦进行了自定义扩展,其实也破坏了“约定优于配置”,构建工作也就不再简单易懂。
所以,自由有自由的代价,标准有标准的好处。
- END -