天天看點

Maven 官宣:幹掉 Maven 和 Gradle!推出更強更快的新一代建構工具!

作者:猿來猿往

Maven和Gradle都是我們程式猿們日常開發必不可少的建構工具。

Apache Maven是一個(特别是Java程式設計)項目管理及自動建構工具,由Apache軟體基金會所提供。基于項目對象模型(縮寫:POM)概念,Maven利用一個中央資訊片斷能管理一個項目的建構、報告和文檔等步驟。

它包含了一個項目對象模型 (Project Object Model),一組标準集合,一個項目生命周期(Project Lifecycle),一個依賴管理系統(Dependency Management System),和用來運作定義在生命周期階段(phase)中插件(plugin)目标(goal)的邏輯。當你使用Maven的時候,你用一個明确定義的項目對象模型來描述你的項目,然後Maven可以應用橫切的邏輯,這些邏輯來自一組共享的(或者自定義的)插件。

Maven 有一個生命周期,當你運作 mvn install 的時候被調用。這條指令告訴 Maven 執行一系列的有序的步驟,直到到達你指定的生命周期。周遊生命周期旅途中的一個影響就是,Maven 運作了許多預設的插件目标,這些目标完成了像編譯和建立一個 JAR 檔案這樣的工作。

Gradle是一個基于Apache Ant和Apache Maven概念的項目自動化建構開源工具。它使用一種基于Groovy的特定領域語言(DSL)來聲明項目設定,也增加了基于Kotlin語言的kotlin-based DSL,抛棄了基于XML的各種繁瑣配置。是一款通用靈活的建構工具,支援maven, Ivy倉庫,支援傳遞性依賴管理,而不需要遠端倉庫或者是pom.xml和ivy.xml配置檔案,基于Groovy,build腳本使用Groovy編寫。

gradle和maven都可以作為java程式的建構工具,但兩者還是有很大的不同之處的:1.可擴充性,gradle比較靈活,maven的靈活性就差一些,但是maven的項目比較容易看懂,并且上手簡單。2.性能比較,gradle比maven運作得快。gradle無論是在可擴充性還是在性能方面都優于maven。

相信作為Java開發者的你早已經受夠了maven的編譯緩慢,但是又由于曆史包袱、使用習慣等問題暫時切換不了其他更快的建構工具,這裡介紹一款更快的maven——maven-mvnd。

# 介紹

maven-mvnd是Apache Maven團隊借鑒了Gradle和Takari後衍生出的更快的建構工具。mvnd内嵌了Maven,也正是因為這個原因我們可以無縫地将Maven切換為mvnd(也不需要單獨安裝Maven)。

在設計上,在mvnd中會生成一個或多個的守護程序來服務建構請求以此來達到并行建構的效果。另外在VM的選擇上,mvnd使用了GraalVM來代替傳統的JVM,與之相比GraalVM啟動速度更快,占用的記憶體更少。

根據文檔描述,與傳統的Maven相比mvnd具有以下優勢:

  • 運作建構的JVM不需要為每個建構重新啟動。
  • Maven插件類的類加載器緩存在多個建構中,插件jars隻會被讀取和解析一次。
  • JVM中JIT生成的本機代碼會被保留。與Maven相比,JIT編譯花費的時間更少。在重複建構期間,JIT優化的代碼立即可用。這不僅适用于來自Maven插件和Maven核心的代碼,也适用于來自JDK本身的所有代碼。

預設情況下,mvnd使用多個CPU核心并行構模組化塊。使用的核心數由公式Math.max(Runtime.getRuntime().availableProcessors() - 1, 1)給出。如果您的源代碼樹不支援并行建構,請在指令行上傳遞-T1以使您的建構串行。

同時官方給出了24核機器上運作的動态圖:

Maven 官宣:幹掉 Maven 和 Gradle!推出更強更快的新一代建構工具!

# 安裝

對于mvnd的安裝,官方文檔給了十分詳細的教程,建議先行閱讀:https://github.com/apache/maven-mvnd 。

小編是通過Homebrew進行安裝的,實踐證明macOS m1安裝使用是沒有問題的。不過需要注意的是通過此種方式安裝的mvnd版本為0.7.1,而經過在ubuntu和macOS m1上進行測試發現此版本并不支援JDK8(可能僅是筆者電腦問題),而通過官方例子所示的JDK11确是沒問題。在JDK8運作mvnd指令會産生以下錯誤:

~ % mvnd -v
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/mvndaemon/mvnd/client/DefaultClient has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:757)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:473)
at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
at java.lang.ClassLoader.loadClass(ClassLoader.java:419)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
at java.lang.ClassLoader.loadClass(ClassLoader.java:352)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:601)           

居然報錯了,我真的是崩潰,說真的我真的好難過啊!!!!!

預估應該是這種方式下載下傳的執行檔案是通過高版本的JDK編譯的,在低版本上運作因為缺少某些方法或特性是以運作不了。在一籌莫展之際,筆者從maven-mvnd的最新版本的更新說明上發現一個Closed issues:Different java versions for mvnd and maven #512,在該問題上作者提供了一種解決方案就是将JAVA_HOME所指定的版本設定為JDK11,并且在運作mvnd指令時加上參數-Dmaven.compiler.release=8,即

mvnd -Dmaven.compiler.release=8 compile           

通過這種方式即能生成出JDK8所對應的編譯代碼。

對于issue #512中作者回應mvnd的最低支援版本是JDK8,但是筆者從0.5.2開始嘗試還是報同樣的錯...或許是筆者電腦存在一定的問題,因為我看到其他人在貼出的結果圖顯示JDK8下最新版本也是能夠安裝并使用的。另外如果還是不行的話也許我們能夠通過手動編譯源碼來生成可執行檔案,具體步驟在官方readme上已經給出相應的步驟。

# 使用

在使用上與Maven的用法是完全相同的,隻需将指令mvn改為mvnd即可。而在筆者本機的實測中,與傳統的Maven相比,通過mvnd的建構所耗費的時間是原來的1/2。

3.1. 從GitHub下載下傳壓縮包

通路倉庫版本位址,https://github.com/apache/maven-mvnd/releases

如下所示

Maven 官宣:幹掉 Maven 和 Gradle!推出更強更快的新一代建構工具!

點選對應開發環境的版本進行下載下傳即可

小編這邊時window系統,下載下傳 mvnd-0.7.1-windows-amd64.zip 版本。

3.2. 解壓并配置環境變量

1、把下載下傳的壓縮包解壓後,配置 環境變量

将mvnd的bin目錄配置到環境變量path中

2、解壓後修改配置檔案,修改conf/mvnd.properties

Maven 官宣:幹掉 Maven 和 Gradle!推出更強更快的新一代建構工具!

拉到底部修改settings檔案目錄,可以指向原安裝maven中的xml檔案,也可單獨放到一個目錄中。

Maven 官宣:幹掉 Maven 和 Gradle!推出更強更快的新一代建構工具!

3、環境變量配置完成,在 cmd 的任意位址,可以識别到 bin 下的 mvnd 指令輸入 mvnd -version 檢視版本資訊

mvnd -version           

輸出如下資訊代表安裝成功!

C:\WINDOWS\system32>mvnd -version
mvnd native client 0.7.1-windows-amd64 (97c587c11383a67b5bd0ff8388bd94c694b91c1e)
Terminal: org.jline.terminal.impl.jansi.win.JansiWinSysTerminal
Apache Maven 3.8.3 (ff8e977a158738155dc465c6a97ffaf31982d739)
Maven home: D:\Code\mvnd-0.7.1-windows-amd64\mvn
Java version: 1.8.0_102, vendor: Oracle Corporation, runtime: D:\JAVA\jdk\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"           

3.3.測試

以多子產品複雜項目在Windows建構為例。

預設情況下,mvnd使用多個 CPU 核心并行構模組化塊,如果該項目不支援并行建構,可以增加-T1參數進行串行建構。

  • maven建構
# 執行maven指令開始建構
mvn clean -U -Dmaven.test.skip=true package
# 最終結果
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  05:14 min
[INFO] Finished at: 2022-01-18T11:28:46+08:00
[INFO] ------------------------------------------------------------------------           
  • mvnd建構(并行)
# 執行maven-mvnd指令開始建構
mvnd clean -U -Dmaven.test.skip=true package
# 最終結果
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  01:45 min (Wall Clock)
[INFO] Finished at: 2022-01-18T11:31:19+08:00
[INFO] ------------------------------------------------------------------------           
  • mvnd建構(串行)
# 執行maven-mvnd指令開始建構
mvnd clean -U -Dmaven.test.skip=true package -T1
# 最終結果
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  04:51 min
[INFO] Finished at: 2022-01-18T11:39:17+08:00
[INFO] ------------------------------------------------------------------------           

# 總結

本文筆者分别從maven-mvnd的介紹、安裝、使用及其出現的一些異常情況展開陳述,如果讀者想知道更多細節可閱讀官方文檔。而也許強化後的Maven依然比不過Gradle,但是在曆史包袱、使用習慣等背景下Maven的這次強化還是很香的。

參考:

https://github.com/apache/maven-mvnd

https://github.com/apache/maven-mvnd/issues/512

https://mp.weixin.qq.com/s/TG_6vq0mgbej8F3Qvpb6Vw

繼續閱讀