Gradle Vs Maven:Java項目構建工具如何選擇?

大家好,我是阿邁達,有趣的互聯網軟件工程師。專業角度分析技術原理,幽默的態度解讀科技互聯網資訊。歡迎進圈交流

前言

在Java項目的開發中,需要引入自動化構建工具來幫助我們管理項目的外部依賴包、項目編譯、打包等工作。Gradle和Maven是Java世界中兩個重要的自動化構建工具,在項目中我們在兩者之間如何選擇呢?兩者有什麼異同點呢?


Gradle Vs Maven:Java項目構建工具如何選擇?

Gradle是【Java開發人員指南】中推薦的幾個核心工具之一,很多開源項目都是採用Gradle進行構建,這得益於Gradle的語法靈活,開發者可以根據自己的實際需求靈活編排構建任務,但Gradle並不是項目構建的唯一選擇。Maven是Ant之後最流行的項目構建工具,它解決了Ant複雜的構建方式,提高了項目構建效率,並集成了編譯部署等功能。在項目開發中選擇哪一種構建方式才是最優的呢?很多開源項目允許開發者選擇任何一種方式進行構建,但是兩者集成的複雜度完全不一樣。所以最終的選擇權在於開發者,項目的大小、個性化需求以及一些其它的配置決定了開發者如何在Maven和Gradle之間選擇。


Gradle Vs Maven:Java項目構建工具如何選擇?


基於Groovy語言的Gradle

Gradle是一個完全自動化的構建自動化系統,它組件的概念和Apache Maven和Ant的概念一樣。它使用基於編程語言Groovy的領域特定語言,這與Apache Maven有所不同,後者使用XML進行項目配置。Gradle它使用有向無環圖確定運行任務的順序。

Gradle於2007年首次發佈,並於2013年被Google用作Android項目的構建系統它旨在支持非常龐大的多工程構建。它也允許增量添加到項目構建中,因為它知道項目的哪些部分已更新。那些依賴於已經的任務將不再執行。目前,最新的穩定版本是2017年2月發佈的3.4版。它支持使用Java,Scala和Groovy進行開發和後續部署,並在將來引入其他項目工作流和語言。

Gradle Vs Maven:Java項目構建工具如何選擇?


基於XML語言的Maven

Maven用於Java項目的自動化構建。它可以幫助開發者確定特定軟件的構建方式及其不同的依賴關係。它使用XML文件描述正在構建的項目以及與第三方模塊有關的軟件依賴性,構建順序以及所需的插件。可以提前定義打包和編譯之類的任務。

Maven將從不同的倉庫下載庫和插件,然後將它們全部放入本地計算機的緩存中。雖然主要用於Java項目,但是開發者可以將其用於Scala,Ruby和C#以及其他多種語言。

Gradle Vs Maven:Java項目構建工具如何選擇?

Gradle與 Maven的比較

Gradle和Maven兩種構建方式存在一些根本差異。 Gradle基於任務依賴關係圖-其中任務就是工作,而Maven是基於固定的過程和線性模型。使用Maven構建項目時,目標將附加到項目階段,目標的作用類似於Gradle的任務,即“完成任務的事物”。

在性能方面,兩者都允許多模塊構建並行運行。但是,Gradle允許增量構建,因為它檢查是否更新了哪些任務。如果是這樣,則不執行任務,從而使構建時間大大縮短。Gradle上其他出色的性能功能包括:

  • Java類的增量編譯
  • 防止反編譯
  • 對增量子任務使用API
  • 編譯器守護程序加快編譯速度

在管理依賴項時,Gradle和Maven都可以處理動態和傳遞性依賴項,以使用第三方依賴項緩存,並讀取POM元數據格式。

還可以通過中央版本控制定義聲明庫版本並強制執行中央版本控制兩者都從其artifact 倉庫下載可傳遞依賴項。 Maven具有Maven Central,而Gradle具有JCenter,也可以定義自己的私人公司存儲庫。如果需要多個依賴項,Maven可以同時下載它們。

Gradle Vs Maven:Java項目構建工具如何選擇?

但是,Gradle在自定義API實現依賴項和併發安全緩存方面優於Maven它還將存儲庫元數據與緩存的依賴項保持在一起,確保使用同一緩存的兩個或多個項目不會相互覆蓋,並且具有基於校驗和的緩存,並且可以將緩存與存儲庫同步

。此外,Gradle與IVY元數據兼容,允許定義自定義規則來為動態依賴項指定版本,並解決版本衝突。這些功能在Maven上並沒有實現。Gradle具有完全可配置的DAG,而對於Maven,一個目標只能附加到另一個目標,多個目標採用有序列表的形式,也就是線性關係。 Gradle還允許任務排除,傳遞排除和任務依賴推斷。


示例代碼

前文講了Maven和Gradle構建配置的方式不一樣,Maven基於XML文件配置,而Gradle基於Groovy語言配置管理,我們以一個樣例代碼說明同一個項目分別用兩種方式構建。我們定義一個test的項目,該項目需要junit依賴包和一些優化代碼的插件(Maven CheckStyle,FindBugs和PMD)

  • 首先看Maven的配置
Gradle Vs Maven:Java項目構建工具如何選擇?


Gradle Vs Maven:Java項目構建工具如何選擇?

從示例代碼可以看到我們寫了很多的的XML配置,定義了項目的group、artifactId和打包的格式,同時定義了netty的依賴。因為要用到Maven CheckStyle,FindBugs和PMD的插件來優化和檢查代碼,所以我們也定義了相應的插件。如果我們的項目需要大量的外部依賴和插件,那我們這個POM文件就非常大。

  • 其次,我們再來看看gradle中的配置

如果項目是基於gradle構建,那構建配置文件是build.gradle。


Gradle Vs Maven:Java項目構建工具如何選擇?


可以看到使用gradle進行構建的時候,同樣的項目,只需要編寫不到10行的代碼,而maven差不多寫了50行左右的代碼,這就是gradle的優勢。

重點:如何選擇

總而言之,Maven和Gradle兩種構建工具有各自的優缺點。

  • 個性化編譯:使用Maven,開發者可以輕鬆定義項目的元數據和依賴項,但是創建高度自定義的版本可能是Maven用戶的噩夢。隨著項目的增長,POM文件很容易膨脹,並且以後可能會成為無法讀取的XML文件。
  • 依賴管理和目錄結構:Maven提供了簡單而有效的依賴關係管理,並且由於它具有項目的目錄結構,因此所有項目都具有某種標準佈局。它為其POM文件使用一個聲明性XML文件,並具有許多可以使用的插件。 Gradle使用Maven上相同的目錄結構,但是可以自定義。它還使用了與Maven用來識別工件的GAV格式相同的格式。
  • 插件和集成:
    Maven具有很多的插件,並與第三方工具(例如CI服務器,代碼覆蓋插件和工件存儲庫系統)無縫集成。就插件而言,現在有越來越多的可用插件,並且有大型廠商具有與Gradle兼容的插件。
  • 靈活性:另一方面,Gradle非常靈活,並且基於腳本。自定義構建將很容易在Gradle上完成。


Gradle Vs Maven:Java項目構建工具如何選擇?

結論

選擇哪種構建工具取決於我們的實際需求,Gradle功能更強大。但是,有時候一箇中小型的項目不需要它提供的大多數功能,則Maven可能就是最佳選擇。而Gradle則是大型項目的最佳選擇。如果一直在使用Maven,但發現項目越來越大,已經不適合使用Maven,這時候就可以從Maven遷移到Gradle。


分享到:


相關文章: