更快的 Maven 來了!性能提升 300%!
Maven經(jīng)常被拿來和Gradle做對(duì)比,最大的劣勢(shì)之一就是Maven構(gòu)建慢,Gradle比Maven構(gòu)建速度快2到10倍,而如今Maven也可以更快了。Apache Maven團(tuán)隊(duì)從Gradle和Takari(Maven生命周期優(yōu)化器)[1]中獲得靈感對(duì)Maven進(jìn)行了強(qiáng)化,衍生出 maven-mvnd[2]項(xiàng)目。
簡單介紹
mvnd并不是對(duì)Maven進(jìn)行了重構(gòu),而是內(nèi)置了Maven。它實(shí)際上是一個(gè)或者多個(gè)Maven守護(hù)進(jìn)程,用來執(zhí)行實(shí)際的構(gòu)建服務(wù)。一個(gè)守護(hù)進(jìn)程實(shí)例可以為來自mvnd客戶端的多個(gè)連續(xù)請(qǐng)求提供Maven構(gòu)建服務(wù)。當(dāng)沒有空閑的守護(hù)進(jìn)程時(shí)來支撐構(gòu)建請(qǐng)求時(shí),mvnd可以并行生成多個(gè)守護(hù)程序。
使用GraalVM代替JVM
mvnd之所以快是因?yàn)樗褂昧?strong style="line-height: 1.75em;">GraalVM替代了傳統(tǒng)的JVM,因此它啟動(dòng)更快,占用內(nèi)存更少,而且在實(shí)行構(gòu)建時(shí)不需要為每個(gè)構(gòu)建啟動(dòng)新的JVM。另外Maven插件在構(gòu)建時(shí)不再需要多次加載,而是緩存在多個(gè)構(gòu)建中。SNAPSHOT版本的Maven插件不會(huì)被緩存。
支持JIT
GraalVM的JIT(Just In Time)實(shí)時(shí)編譯特性也被運(yùn)用到Maven構(gòu)建作業(yè)中。JIT可以大大降低編譯時(shí)間,在重復(fù)構(gòu)建過程中,JIT優(yōu)化代碼立即可用,也極大提高了構(gòu)建效率。
并行構(gòu)建
目前Maven 3的并行構(gòu)建(parallel builds)還是實(shí)驗(yàn)特性,而且要求使用的插件必須是線程安全的。而mvnd默認(rèn)就支持使用多個(gè)CPU內(nèi)核進(jìn)行并行構(gòu)建。當(dāng)然如果你的源代碼不支持并行構(gòu)建,也可以通過添加- T1 參數(shù)切換到串行構(gòu)建。
簡單嘗試
接下來簡單嘗試一下mvnd。
安裝
目前mvnd已經(jīng)支持Linux、MacOS、Windows平臺(tái)。你可以分別通過SDKMAN、Homebrew、Chocolatey這些包管理器進(jìn)行安裝。也可以直接去mvnd發(fā)行版?zhèn)}庫[3]下載對(duì)應(yīng)的二進(jìn)制進(jìn)行安裝。這里以Windows為例,我選擇Chocolatey安裝:
choco?install?mvndaemon
時(shí)間可能比較長一些。
配置
配置很簡單,只需要注意兩點(diǎn)
如果不使用包管理器進(jìn)行安裝的話請(qǐng)確保mvnd的 bin目錄關(guān)聯(lián)到PATH。如果沒有配置或者不想配置 JAVA_HOME環(huán)境變量的話請(qǐng)?jiān)?code style="font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(40, 202, 113);">~/.m2/mvnd.properties中設(shè)置java.home以指定Java目錄,例如:java.home=C:\\AdoptOpenJDK\\jdk-8。已經(jīng)配置環(huán)境變量的請(qǐng)忽略該條。
其它的配置項(xiàng)可參考mvnd配置[4]。
使用
安裝配置完畢后命令行執(zhí)行mvnd --version出現(xiàn)下列結(jié)果就表示安裝成功了。
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"
為了降低學(xué)習(xí)成本mvnd的方式和傳統(tǒng)Maven類似,mvn變成了mvnd,你也可以通過mvnd --help來查看完整的命令選項(xiàng)清單。
說實(shí)話并行構(gòu)建就是快,簡直坐火箭一般。另外,控制臺(tái)輸出也優(yōu)化了。

由于GraalVM的加持,這個(gè)工具很可能會(huì)延長Maven的生命,避免過早被Gradle拉開優(yōu)勢(shì)。對(duì)于我們來說,這個(gè)項(xiàng)目可以觀望一下,看看Apache Maven官方的進(jìn)一步動(dòng)作。
參考資料
[1]Takari(Maven生命周期優(yōu)化器): http://takari.io/book/40-lifecycle.html [2]maven-mvnd: https://github.com/apache/maven-mvnd [3]mvnd發(fā)行版?zhèn)}庫: https://github.com/mvndaemon/mvnd/releases [4]mvnd配置: https://github.com/mvndaemon/mvnd/blob/master/dist/src/main/distro/conf/mvnd.properties
程序汪資料鏈接
程序汪接的7個(gè)私活都在這里,經(jīng)驗(yàn)整理
Java項(xiàng)目分享 最新整理全集,找項(xiàng)目不累啦 06版
堪稱神級(jí)的Spring Boot手冊(cè),從基礎(chǔ)入門到實(shí)戰(zhàn)進(jìn)階
臥槽!字節(jié)跳動(dòng)《算法中文手冊(cè)》火了,完整版 PDF 開放下載!
臥槽!阿里大佬總結(jié)的《圖解Java》火了,完整版PDF開放下載!
字節(jié)跳動(dòng)總結(jié)的設(shè)計(jì)模式 PDF 火了,完整版開放下載!
歡迎添加程序汪個(gè)人微信 itwang005? 進(jìn)粉絲群或圍觀朋友圈
