大家好,我是阿邁達,有趣的互聯網軟件工程師。專業角度分析技術原理,幽默的態度解讀科技互聯網資訊。歡迎進圈交流
大家好,我是阿邁達,有趣的互聯網軟件工程師。專業角度分析技術原理,幽默的態度解讀科技互聯網資訊。歡迎進圈交流
在Java項目的開發中,需要引入自動化構建工具來幫助我們管理項目的外部依賴包、項目編譯、打包等工作。Gradle和Maven是Java世界中兩個重要的自動化構建工具,在項目中我們在兩者之間如何選擇呢?兩者有什麼異同點呢?
Gradle是【Java開發人員指南】中推薦的幾個核心工具之一,很多開源項目都是採用Gradle進行構建,這得益於Gradle的語法靈活,開發者可以根據自己的實際需求靈活編排構建任務,但Gradle並不是項目構建的唯一選擇。Maven是Ant之後最流行的項目構建工具,它解決了Ant複雜的構建方式,提高了項目構建效率,並集成了編譯部署等功能。在項目開發中選擇哪一種構建方式才是最優的呢?很多開源項目允許開發者選擇任何一種方式進行構建,但是兩者集成的複雜度完全不一樣。所以最終的選擇權在於開發者,項目的大小、個性化需求以及一些其它的配置決定了開發者如何在Maven和Gradle之間選擇。
Gradle是一個完全自動化的構建自動化系統,它組件的概念和Apache Maven和Ant的概念一樣。它使用基於編程語言Groovy的領域特定語言,這與Apache Maven有所不同,後者使用XML進行項目配置。Gradle它使用有向無環圖確定運行任務的順序。
Gradle於2007年首次發佈,並於2013年被Google用作Android項目的構建系統。它旨在支持非常龐大的多工程構建。它也允許增量添加到項目構建中,因為它知道項目的哪些部分已更新。那些依賴於已經的任務將不再執行。目前,最新的穩定版本是2017年2月發佈的3.4版。它支持使用Java,Scala和Groovy進行開發和後續部署,並在將來引入其他項目工作流和語言。
Maven用於Java項目的自動化構建。它可以幫助開發者確定特定軟件的構建方式及其不同的依賴關係。它使用XML文件描述正在構建的項目以及與第三方模塊有關的軟件依賴性,構建順序以及所需的插件。可以提前定義打包和編譯之類的任務。
Maven將從不同的倉庫下載庫和插件,然後將它們全部放入本地計算機的緩存中。雖然主要用於Java項目,但是開發者可以將其用於Scala,Ruby和C#以及其他多種語言。
Gradle和Maven兩種構建方式存在一些根本差異。 Gradle基於任務依賴關係圖-其中任務就是工作,而Maven是基於固定的過程和線性模型。使用Maven構建項目時,目標將附加到項目階段,目標的作用類似於Gradle的任務,即“完成任務的事物”。
在性能方面,兩者都允許多模塊構建並行運行。但是,Gradle允許增量構建,因為它檢查是否更新了哪些任務。如果是這樣,則不執行任務,從而使構建時間大大縮短。Gradle上其他出色的性能功能包括:
在管理依賴項時,Gradle和Maven都可以處理動態和傳遞性依賴項,以使用第三方依賴項緩存,並讀取POM元數據格式。
還可以通過中央版本控制定義聲明庫版本並強制執行中央版本控制。兩者都從其artifact 倉庫下載可傳遞依賴項。 Maven具有Maven Central,而Gradle具有JCenter,也可以定義自己的私人公司存儲庫。如果需要多個依賴項,Maven可以同時下載它們。但是,Gradle在自定義API實現依賴項和併發安全緩存方面優於Maven。它還將存儲庫元數據與緩存的依賴項保持在一起,確保使用同一緩存的兩個或多個項目不會相互覆蓋,並且具有基於校驗和的緩存,並且可以將緩存與存儲庫同步 。此外,Gradle與IVY元數據兼容,允許定義自定義規則來為動態依賴項指定版本,並解決版本衝突。這些功能在Maven上並沒有實現。Gradle具有完全可配置的DAG,而對於Maven,一個目標只能附加到另一個目標,多個目標採用有序列表的形式,也就是線性關係。 Gradle還允許任務排除,傳遞排除和任務依賴推斷。
前文講了Maven和Gradle構建配置的方式不一樣,Maven基於XML文件配置,而Gradle基於Groovy語言配置管理,我們以一個樣例代碼說明同一個項目分別用兩種方式構建。我們定義一個test的項目,該項目需要junit依賴包和一些優化代碼的插件(Maven CheckStyle,FindBugs和PMD)。
從示例代碼可以看到我們寫了很多的的XML配置,定義了項目的group、artifactId和打包的格式,同時定義了netty的依賴。因為要用到Maven CheckStyle,FindBugs和PMD的插件來優化和檢查代碼,所以我們也定義了相應的插件。如果我們的項目需要大量的外部依賴和插件,那我們這個POM文件就非常大。
如果項目是基於gradle構建,那構建配置文件是build.gradle。
可以看到使用gradle進行構建的時候,同樣的項目,只需要編寫不到10行的代碼,而maven差不多寫了50行左右的代碼,這就是gradle的優勢。
總而言之,Maven和Gradle兩種構建工具有各自的優缺點。
選擇哪種構建工具取決於我們的實際需求,Gradle功能更強大。但是,有時候一箇中小型的項目不需要它提供的大多數功能,則Maven可能就是最佳選擇。而Gradle則是大型項目的最佳選擇。如果一直在使用Maven,但發現項目越來越大,已經不適合使用Maven,這時候就可以從Maven遷移到Gradle。
閱讀更多 阿邁達聊技術 的文章