最近在評估單位內部的Java專案建置工具,主要的評估對象是Maven & Gradle,基本上是大方向的評估,還沒有深入到技術細節上的差異。以目前在網上查到的資料來看,絕大多數都是推薦使用Gradle,這點也是很有趣,和Maven的高市佔完全相反,想看其他的反面意見,可能還得另外下關鍵字才搜的到。

這篇主要介紹Maven/Gradle的一些特性,和從幾個不同角度來看Maven or Gradle的選擇,但基本上這題沒有標準答案,主要還是取決於人、組織、專案特性、還有個人偏好。

建置工具歷史沿革

  • Maven長期以來一直是預設的Java組建工具,主要原因是他標準化的組建程序與結構。但Gradle在過去幾年越來越受歡迎,最大的原因可能是其組建腳本的簡潔特性。
  • Maven試圖解決Ant過於靈活、沒有幫助開發者管理依賴項目的缺點。改以「約定而非配置」的理念,並集中管理相依性,讓開發者在最短時間內了解專案組建的完整狀況。
  • Gradle認為Maven的組建程序沒有彈性,過度主觀,故根據Ant & Maven的概念,並使用基於Groovy領域特定語言來宣告專案組態,以編寫自訂且複雜的組建邏輯。

特性說明

  • 兩者皆為開源工具。
  • 皆為依賴管理與專案建構自動化工具。
  • 皆為外掛 (plug-in) 依賴,可透過外掛來完成大多數的建構任務。
  • 內建支援依賴管理,兩者皆兼容Maven Repository。
  • 支援多模組建置。
  • 建置腳本:Maven為XML,Gradle為Groovy。
  • 專案結構標準化:Gradle可客製,Maven似乎也可以(但目前看到的討論資料似乎是不建議,可能會和一些外掛有所衝突?)
  • 建置作法:Maven是透過專案生命週期,Gradle則是任務依賴關係圖。

評估比較

這部分我認為大略可以從幾個角度著手:

  • 市佔率/成熟度:高市佔/成熟度意味著更豐富的外掛資源,較低的問題解決成本,從這點來看,Maven相對成熟,版更頻率亦較低。另參考Datanyze的資料(2020/5/9),Maven市佔率遠高於Gradle(55.16% vs 4.28%),其實這麼大的落差我是有點懷疑的,不確定這個網站背後的統計數字根據是什麼。

image

  • 學習成本:XML vs Groovy,基本上對大多數組織而言,Groovy語言很可能是額外的學習成本,這點也和組織人員的能力有關。
  • CI工具整合:兩者皆可與現行主流CI工具整合,例如Jenkins。
  • 外掛資源:Maven > Gradle。但另一個角度是或許在Maven中需要使用外掛的狀況,在Gradle卻不需要。
  • 專案適用性:思考是否會有組織內部既有專案不適用的狀況。
  • 轉換成本:針對組織現行的Legacy專案,從舊的建置工具轉換的成本(例如Ant),主要的成本我認為在於專案結構標準化與第三方Library相依性管理。
  • IDE整合程度:以Eclipse來說內建支援Maven,而Gradle似乎得另外使用plugin。
  • 標準化 vs 彈性(靈活性)的取捨:工具的靈活性也往往導致不易標準化的問題,這點的重要性就和組織特性有關了。
  • 建置效能:依據Gradle官方資料,Gradle在建置效能上是高於Maven的。這點的重要性也是取決於組織內部的專案特性,對許多單位的一般專案而言,我認為影響應該大多不大。

除了上述幾項,我想還可以再從幾個角度來評估:

  • Gradle想改善的Maven缺點,是否是組織實際遭遇的痛點:每個新技術通常都是為了解決舊技術的某些缺點,但也往往會帶來另外的問題,故並無絕對的優劣問題,只有適用性的問題。
  • Maven <-> Gradle的轉換成本:假設今天選擇Maven,從最糟的狀況來看,若最後實務上發現有不得不改為使用Gradle的理由,此時的可行性與成本為何,以此例Maven轉換為Gradle來看,初步看起來可行性與成本亦不高,主因在於:
    • Gradle遵循許多與Maven相同的約定,例如程式碼標準專案結構、Library的管理同樣都支援Maven Repository 。
    • 建置設定檔的轉換有現成工具支援。

建置工具的選擇考量(參考資料: 持續交付使用Java

Ant + Ivy

  • 若你的組織已有大量投資此工具,或正在遷移/升級一個已經使用此工具的專案,它就是一個好選擇。
  • 可完全控制專案的目錄結構、組建工具,以及組建生命週期。
  • 若你的組織希望讓事情標準化,它就不是個好選擇,因為Ant提供的彈性意味著組建腳本經常在布局和程序上有所差異。
  • 一般而言,不建議在使用現代框架(例如Spring Boot)的專案中使用他。

Maven

  • 組建Java app時很好的選擇,特別是當你的組織對於此組建工具已有很好的技術或投資時。
  • 缺乏彈性,以及編寫自訂外掛帶來的挑戰,代表此工具不適合需要採取自訂組建程序的專案(不要你要檢查是否真的需要自訂組建程序)。
  • 如果你正在進行一個有許多依賴項目的簡單專案,不建議使用它,瀏覽500行以上的pom.xml很有挑戰性。

Gradle

  • 適合用來組建在生命週期或程序中,需要比Maven所提供的彈性更多彈性的專案。
  • 與Groovy語言以及相關的測試框架(例如Spock或Geb)的整合非常出色。
  • Gradle DSL與Groovy的組合可讓你編寫自訂且複雜的組建邏輯。
  • 很適合Spring Boot與其他微服務框架,而且與基於合約的測試工具 (Contract-Based)有非常實用的整合。
  • 如果你的組織只使用Java,他的學習曲線(與Groovy相關)可能讓你不適合選擇它。
  • 如果你的組織喜歡把事情標準化,那就不適合這個選項,因為編寫build.gradle的方式有很多種。
arrow
arrow
    文章標籤
    maven gradle java ant
    全站熱搜

    AKIRA 發表在 痞客邦 留言(0) 人氣()