Maven經常被拿來和Gradle做對比,最大的劣勢之一就是Maven構建慢,Gradle比Maven構建速度快2到10倍,而如今Maven也可以更快了。Apache Maven團隊從Gradle和Takari(Maven生命週期優化器)中獲得靈感對Maven進行了強化,衍生出 maven-mvnd專案,今天胖哥帶你來嚐嚐鮮。
簡單介紹
mvnd並不是對Maven進行了重構,而是內建了Maven。它實際上是一個或者多個Maven守護程式,用來執行實際的構建服務。一個守護程式例項可以為來自mvnd客戶端的多個連續請求提供Maven構建服務。當沒有空閒的守護程式時來支撐構建請求時,mvnd可以並行生成多個守護程式。
使用GraalVM代替JVM
mvnd之所以快是因為它使用了GraalVM替代了傳統的JVM,因此它啟動更快,佔用記憶體更少,而且在實行構建時不需要為每個構建啟動新的JVM。另外Maven外掛在構建時不再需要多次載入,而是快取在多個構建中。SNAPSHOT版本的Maven外掛不會被快取。
支援JIT
GraalVM的JIT(Just In Time)實時編譯特性也被運用到Maven構建作業中。JIT可以大大降低編譯時間,在重複構建過程中,JIT優化程式碼立即可用,也極大提高了構建效率。
並行構建
目前Maven 3的並行構建(parallel builds)還是實驗特性,而且要求使用的外掛必須是執行緒安全的。而mvnd預設就支援使用多個CPU核心進行並行構建。當然如果你的原始碼不支援並行構建,也可以通過新增- T1
引數切換到序列構建。
簡單嘗試
接下來簡單嘗試一下mvnd。
安裝
目前mvnd已經支援Linux、MacOS、Windows平臺。你可以分別通過SDKMAN、Homebrew、Chocolatey這些包管理器進行安裝。也可以直接去mvnd發行版倉庫下載對應的二進位制進行安裝。這裡以Windows為例,我選擇Chocolatey安裝:
choco install mvndaemon
時間可能比較長一些。
配置
配置很簡單,只需要注意兩點
- 如果不使用包管理器進行安裝的話請確保mvnd的
bin
目錄關聯到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 獲取更多資訊