天天看點

為什麼Spring官方推薦應用開發使用Gradle?Gradle更優秀是未來

作者:愛科學的衛斯理

Spring官方曾釋出一篇文章《Spring/Spring Boot編譯工具從Maven遷移到了Gradle》,說明為什麼Spring(2012年)和Spring Boot(2020)的源碼建構使用Gradle。主要遷移的原因還是因為Gradle的建構速度遠遠優于Maven。

為什麼Spring官方推薦應用開發使用Gradle?Gradle更優秀是未來

近期,生成Spring Boot應用項目的網站Spring Initializr(start.spring.io),也開始使用Gradle作為預設的建構工具。

為什麼Spring官方推薦應用開發使用Gradle?Gradle更優秀是未來

這給習慣于使用Maven的開發者帶來了不少的困惑和不贊同,有沒有去做這個調整嗎?

Spring官方在Spring Initializr的github的issue上給出了答案,我帶大家一起來閱讀下這個issue(https://github.com/spring-io/start.spring.io/issues/1012)。

Andy Wilkinson(Spring Boot主要研發)

start.spring.io團隊認為,對于今天開始一個新項目的任何人來說,Gradle是更好用的建構系統。對于基于Spring Boot 3.0的應用程式尤其如此,在這些應用程式中,開發人員使用Gradle進行AOT(Spring 6和Spring Boot 3.0颠覆性的新特性)處理的體驗要好得多。我們希望推動社群使用Gradle,同時確定Maven對于那些喜歡它的人來說隻需點選一下即可。
為什麼Spring官方推薦應用開發使用Gradle?Gradle更優秀是未來

Gradle是更好用的建構系統

提問者

為什麼你認為Gradle是更好的建構系統?在我看來,Maven更易于使用且不易混淆,尤其是對于初學者而言。
為什麼Spring官方推薦應用開發使用Gradle?Gradle更優秀是未來

為什麼Gradle是更好的建構系統

Cédric Champeau(來自Oracle Labs,在Micronaut團隊工作)

為什麼你認為Gradle是更好的建構系統?

為了能夠說什麼是“更好”,我們需要獲得更好的資格。我不會說Gradle絕對更好,但它确實在很多方面擊敗了Maven。當我們想要比較時,我們應該盡量做到真實。

在我看來,Maven更易于使用且不易混淆,尤其是對于初學者而言。

我不同意這個觀點,并用幾個方面來說明Gradle在客觀上比Maven更好。

首先,我想大家都同意Maven比Gradle使用更廣泛。

是以,有一個習慣偏差,即你知道Maven這個工具,是以你可以“更容易”地使用它:你知道這些指令,你更習慣閱讀POM檔案等。

第二個偏見是Maven已經存在多年,是以許多流程都是圍繞Maven細節建構的。

例如,人們很難停止調用mvn clean install,這并不奇怪。這是使用Maven工具的結果,多年來,如果你在install前沒有進行clean,Maven就一直不可靠。當然,你會發現有人說“你不再需要再clean了”,但這并不完全正确。

Gradle就沒有這樣的問題,因為它是一個完全增量建構系統。

在Gradle中,一切都聲明了輸入和輸出,是以無論何時執行指令,Gradle都知道要重新執行或不執行什麼,包括在需要時删除陳舊檔案。

Gradle還為Java(和Groovy)提供增量編譯,以及避免編譯(如果下遊項目沒有改變,則避免重新建構)。

一般來說,Gradle比Maven快得多,而且Gradle建構緩存讓事情變得更加有趣。

Gradle還解決了長期存在的問題,例如類路徑污染。

在建構結構方面,現代Gradle建構的設計明顯優于舊版本。Gradle通過“偏愛組合而不是繼承”來修複臭名昭著的Maven單繼承模型。

Gradle還可以對其他插件的應用做出反應,使其具有高度的可組合性和可重用性。我甚至沒有提到可以測試你的建構邏輯本身這一事實,這是一個巨大的勝利。讓我用Micronaut如何使用約定插件來說明Micronaut中的每個項目都配置相同,而沒有認知開銷:一個項目說明它是什麼(BOM),而不是如何建構。

Gradle還高度關注開發人員的生産力。例如,持續監視源代碼變化并立即重新執行任務(編譯、測試)的連續模式改變了遊戲規則。類似地,複合建構在多個庫的內建方面改變了遊戲規則,與舊的但是不錯的SNAPSHOT相比。

在依賴管理方面,Gradle也比Maven提供的領先多年(依賴限制、依賴驗證、豐富的版本限制、子產品替換、變體感覺解決...),可以解決現實世界的問題,但也支援更複雜的生态系統,如Android或Kotlin MPP。

Gradle可以更好的另一個例子是插件作者。正如Andy所說,作為插件作者,Gradle讓我們的生活變得更加輕松,因為它沒有Maven生命周期的限制。對于像原生建構這樣的複雜主題,它需要的東西明顯偏離主要方法,例如因為我們需要在JVM模式下運作測試,然後運作原生建構,然後在原生模式下運作測試,并使用先前的輸出測試等...Gradle模型明顯更适合于此并且不會強迫我們插件作者編寫複雜的代碼到達Maven的内部來完成這份工作。Gradle更容易。

我知道改變會有很多阻力,但恕我直言,Gradle是未來。我也永遠不會說學習曲線是平坦的:它不是,特别是對于那些已經深入Maven多年的人來說:Gradle的工作方式根本不同,但一旦你習慣了,就很難再回來了。當然,你會發現人們從Gradle復原到Maven,這是不可避免的。

長話短說:你會發現人們說Maven比Gradle更好。如果你這樣做,請定義“更好”,因為我可以客觀地找到Gradle更好的許多地方。我個人可以找到Maven“更好”的地方。例如,Maven更容易傳遞屬性以覆寫建構的某些屬性。然而,這通常與你應該如何設計Gradle建構的“錯誤心态”有關(例如,人們習慣使用Maven配置檔案,而Gradle完全不需要它們)。或者,與Gradle相比,對插件作者來說MavenAPI的穩定性,Gradle每年都在快速發展并且破壞一次(對于每個主要版本)。這對插件作者來說是一個痛點,但對使用者來說卻不是,因為使用者通常不會受此困擾。

我不會繼續說下去,因為有很多理由讓人更喜歡Gradle而不是Maven。最後你還是選擇留在Maven,我不會!

結語

Gradle更優秀,Gradle是未來!在Spring Boot 3.0到來之際,是時候了解一下了!

感謝對我的書《從企業級開發到雲原生微服務:Spring Boot實戰》的支援。

轉載請注明出處:今日頭條:愛科學的衛斯理

(此處已添加書籍卡片,請到今日頭條用戶端檢視)