為什么 Spring Boot 2.3.0 放棄Maven最終擁抱Gradle


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

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

例如: 項目構建工具。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 對並行構建的支持。由於 Spring Boot 構建的復雜性,特別是對 Invoker 插件的使用,嘗試失敗。通過將構建分為四個部分來解決 CI 問題。首先構建項目的主要核心,然后並行構建三個獨立的部分。但 CI 的構建仍需要一個小時或更長時間。此外,由於針對的是模塊化 CI 構建,因此並沒有使得開發人員本地構建效率有所改變。

Spring Boot 團隊在其他利用 Gradle 作為構建工具的 Spring 項目中看到了 Gradle 的增量並行構建以及在第三方項目中看到了 Gradle 的構建緩存的好處。希望通過使用 Gradle 為 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 秒,如以下截圖所示:

如果對構建性能的更多細節感興趣,可以在 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權限管理系統 歡迎關注


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM