更快的Maven來了

碼農小胖哥發表於2021-12-25

Maven經常被拿來和Gradle做對比,最大的劣勢之一就是Maven構建慢,GradleMaven構建速度快2到10倍,而如今Maven也可以更快了。Apache Maven團隊從GradleTakari(Maven生命週期優化器)中獲得靈感對Maven進行了強化,衍生出 maven-mvnd專案,今天胖哥帶你來嚐嚐鮮。

簡單介紹

mvnd並不是對Maven進行了重構,而是內建了Maven。它實際上是一個或者多個Maven守護程式,用來執行實際的構建服務。一個守護程式例項可以為來自mvnd客戶端的多個連續請求提供Maven構建服務。當沒有空閒的守護程式時來支撐構建請求時,mvnd可以並行生成多個守護程式。

使用GraalVM代替JVM

mvnd之所以快是因為它使用了GraalVM替代了傳統的JVM,因此它啟動更快,佔用記憶體更少,而且在實行構建時不需要為每個構建啟動新的JVM。另外Maven外掛在構建時不再需要多次載入,而是快取在多個構建中。SNAPSHOT版本的Maven外掛不會被快取。

支援JIT

GraalVMJIT(Just In Time)實時編譯特性也被運用到Maven構建作業中。JIT可以大大降低編譯時間,在重複構建過程中,JIT優化程式碼立即可用,也極大提高了構建效率。

並行構建

目前Maven 3的並行構建(parallel builds)還是實驗特性,而且要求使用的外掛必須是執行緒安全的。而mvnd預設就支援使用多個CPU核心進行並行構建。當然如果你的原始碼不支援並行構建,也可以通過新增- T1 引數切換到序列構建。

簡單嘗試

接下來簡單嘗試一下mvnd

安裝

目前mvnd已經支援LinuxMacOSWindows平臺。你可以分別通過SDKMANHomebrewChocolatey這些包管理器進行安裝。也可以直接去mvnd發行版倉庫下載對應的二進位制進行安裝。這裡以Windows為例,我選擇Chocolatey安裝:

choco install mvndaemon

時間可能比較長一些。

配置

配置很簡單,只需要注意兩點

  • 如果不使用包管理器進行安裝的話請確保mvndbin目錄關聯到PATH
  • 如果沒有配置或者不想配置JAVA_HOME環境變數的話請在~/.m2/mvnd.properties中設定java.home以指定Java目錄,例如:java.home=C:\\AdoptOpenJDK\\jdk-8。已經配置環境變數的請忽略該條。

其它的配置項可參考mvnd配置

使用

安裝配置完畢後命令列執行mvnd --version出現下列結果就表示安裝成功了。

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: C:\Program Files\mvndaemon\mvnd-0.7.1-windows-amd64\mvn
Java version: 1.8.0_282, vendor: AdoptOpenJDK, runtime: C:\Program Files\AdoptOpenJDK\jdk-8.0.282.8-hotspot\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"

為了降低學習成本mvnd的方式和傳統Maven類似,mvn變成了mvnd,你也可以通過mvnd --help來檢視完整的命令選項清單。

說實話並行構建就是快,簡直坐火箭一般。另外,控制檯輸出也優化了。

由於GraalVM的加持,這個工具很可能會延長Maven的生命,避免過早被Gradle拉開優勢。對於我們來說,這個專案可以觀望一下,看看Apache Maven官方的進一步動作。

關注公眾號:Felordcn 獲取更多資訊

個人部落格:https://felord.cn

相關文章