爲何 Spring Boot 2.3.0 放棄Maven最終擁抱Gradle

在 2.3.0 中對 Spring Boot 進行了至關重大的更改,這是使用 Gradle 而非 Maven 構建的項目的第一個版本。git

Spring 的每一個項目都獨立的項目組在開發運營,在用戶最常使用的白盒部分(例如 API 設計)保持一致性,對於用戶不可見的黑盒部分,各個項目組選擇本身適合工具沒有統一的約定。spring

例如: 項目構建工具。Spring Framework 自 2012 年的 3.2.0 起就使用 Gradle 構建,而一年後開始使用 Spring Boot,此後不久又開始使用 Spring Cloud,二者都基於 Maven。緩存

項目 構建工具
Spring Framework Gradle
Spring Boot Maven
Spring Cloud Maven

爲何要切換

Spring Boot 團隊考慮由 Maven 切換到 Gradle 的主要緣由爲了減小構建項目所需的時間。在開發和測試過程當中,等待構建完成所花費的時間增長了修復錯誤和實現新功能所花費的時間。maven

爲了解決這個問題,團隊曾嘗試利用 Maven 對並行構建的支持。因爲 Spring Boot 構建的複雜性,特別是對 Invoker 插件的使用,嘗試失敗。經過將構建分爲四個部分來解決 CI 問題。首先構建項目的主要核心,而後並行構建三個獨立的部分。但 CI 的構建仍須要一個小時或更長時間。此外,因爲針對的是模塊化 CI 構建,所以並無使得開發人員本地構建效率有所改變。模塊化

Spring Boot 團隊在其餘利用 Gradle 做爲構建工具的 Spring 項目中看到了 Gradle 的增量並行構建以及在第三方項目中看到了 Gradle 的構建緩存的好處。但願經過使用 Gradle 爲 Spring Boot 構建得到相似的好處。spring-boot

Gradle 具備很是靈活的構建模型,而且能夠定義每一個任務的輸入和輸出及其相互依賴性。這種構建模型的好處是,它容許任務並行運行,同時也能夠增量、緩存或徹底跳過。換句話說,Gradle 能夠最小化的執行必要的 CI 任務。雖然可使用了 Gradle Enterprise 的 Maven 支持,咱們也能夠享受構建緩存和跳過的好處。可是要充分享受這四個方面的好處,必須嘗試切換到 Gradle。工具

如何切換

Gradle 配置過於靈活,致使它的構建比基於 Maven 構建更難以維護和理解。例如: 同一個構建結果,能夠經過不一樣的配置實現。若是切換到 Gradle,須要避免這種狀況。從目前發佈的四個 Spring Boot 2.3 里程碑版本,在覈心團隊或貢獻者中,尚未發現任何重大的構建問題。性能

  • Spring Boot 關鍵功能是約定優於配置,將這種方法應用於構建。避免在 build.gradle 文件中包含命令式邏輯,編寫了幾個能夠在項目的中找到的小插件 buildSrc。。

雖然現有 Gradle 生態系統對 Spring Boot 構建幾乎空白,須要從頭經過編寫不少通用的 gradle 插件來應用到 Spring Boot,但遷移到 Gradle 的提交從代碼庫中刪除了近 9500 行。測試

切換結果

就減小項目構建時間而言,將構建遷移到 Gradle 無疑是成功的。如上所述,在 CI 和開發人員機器上,基於 Maven 的完整構建都須要一個小時或更長時間。而基於 Gradle 的平均成功構建時間爲 9 分 22 秒,如如下截圖所示:
gradle

若是對構建性能的更多細節感興趣,能夠在 Spring Boot 的公共Gradle Enterprise實例上得到更多數據。

除了提升性能外,對其餘功能進行探索。例如,一段時間以來,進行許多不穩定的測試。因爲這些緣由,構建失敗的次數比預期要多,能夠在 Tests 儀表板中看到這一點。使用 Gradle 分片測試來替代 CI 的通用測試方案,並幫組咱們瞭解是否已成功解決問題。

結論

CI 構建如今平均大約須要 20 分鐘,比之前快 3-4 倍。
本地構建平均須要 2 分鐘 30 秒,比之前快 20-30 倍。

https://spring.io/blog/2020/06/08/migrating-spring-boot-s-build-to-gradle

https://gitee.com/sxfad/gradle-scripts
項目推薦: Spring Cloud 、Spring Security OAuth2的RBAC權限管理系統 歡迎關注

相關文章
相關標籤/搜索