五分鐘技術(shù)趣談 | mvnd:更快的maven來了
Labs 導(dǎo)讀
Maven和Gradle都是我們程序猿們?nèi)粘i_發(fā)必不可少的構(gòu)建工具,但兩者還是有很大的不同之處的:1.可擴(kuò)展性,Gradle比較靈活,maven的靈活性就差一些,但是maven的項目比較容易看懂,并且上手簡單;2.性能比較,Gradle比maven運行得快。Gradle無論是在可擴(kuò)展性還是在性能方面都優(yōu)于Maven。
相信作為Java開發(fā)者的你早已經(jīng)受夠了maven的編譯緩慢,但是又由于歷史包袱、使用習(xí)慣等問題暫時切換不了其他更快的構(gòu)建工具,這里介紹一款更快的Maven——maven-mvnd[1]。
Part 01
介紹
mvnd并不是對Maven進(jìn)行了重構(gòu),而是內(nèi)置了Maven。它實際上是一個或者多個Maven守護(hù)進(jìn)程,用來執(zhí)行實際的構(gòu)建服務(wù)。一個守護(hù)進(jìn)程實例可以為來自mvnd客戶端的多個連續(xù)請求提供Maven構(gòu)建服務(wù)。當(dāng)沒有空閑的守護(hù)進(jìn)程時來支撐構(gòu)建請求時,mvnd可以并行生成多個守護(hù)程序。
使用GraalVM代替JVM
mvnd之所以快是因為它使用了GraalVM替代了傳統(tǒng)的JVM,因此它啟動更快,占用內(nèi)存更少,而且在實行構(gòu)建時不需要為每個構(gòu)建啟動新的JVM。另外Maven插件在構(gòu)建時不再需要多次加載,而是緩存在多個構(gòu)建中。SNAPSHOT版本的Maven插件不會被緩存。
支持JIT
GraalVM的JIT(Just In Time)實時編譯特性也被運用到Maven構(gòu)建作業(yè)中。JIT可以大大降低編譯時間,在重復(fù)構(gòu)建過程中,JIT優(yōu)化代碼立即可用,也極大提高了構(gòu)建效率。
并行構(gòu)建
目前Maven 3的并行構(gòu)建(parallel builds)還是實驗特性,而且要求使用的插件必須是線程安全的。而mvnd默認(rèn)就支持使用多個CPU內(nèi)核進(jìn)行并行構(gòu)建。當(dāng)然如果你的源代碼不支持并行構(gòu)建,也可以通過添加- T1參數(shù)切換到串行構(gòu)建。
Part 02
簡單嘗試
- 安裝
目前mvnd已經(jīng)支持Linux、MacOS、Windows平臺。你可以分別通過SDKMAN、Homebrew、Chocolatey這些包管理器進(jìn)行安裝。也可以直接去mvnd發(fā)行版?zhèn)}庫[2]下載對應(yīng)的二進(jìn)制進(jìn)行安裝。這里以Windows為例,小編選擇 從mvnd發(fā)行版?zhèn)}庫[2]下載壓縮包,如下圖所示:
圖片
選擇下載 maven-mvnd-1.0-m6-m40-windows-amd64.zip版本。
- 配置
配置很簡單,只需要注意幾點:
如果不使用包管理器進(jìn)行安裝的話請確保mvnd的bin目錄關(guān)聯(lián)到PATH。
解壓后修改配置文件,修改conf/mvnd.properties。拉到底部修改settings文件目錄,可以指向原安裝maven中的xml文件,也可單獨放到一個目錄中。
圖片
如果沒有配置或者不想配置JAVA_HOME環(huán)境變量的話請在~/.m2/mvnd.properties中設(shè)置java.home以指定Java目錄,例如:java.home=C:\\AdoptOpenJDK\\jdk-8。已經(jīng)配置環(huán)境變量的請忽略該條。
其他配置可參考mvnd配置[3]。
- 驗證
環(huán)境變量配置完成,在cmd的任意地址,可以識別到bin下的 mvnd 命令輸入mvnd -version查看版本信息,輸出如下信息代表安裝成功!
圖片
- 使用
在使用上與Maven的用法是完全相同的,只需將命令mvn改為mvnd即可。而在筆者本機(jī)的實測中,與傳統(tǒng)的Maven相比,通過mvnd的構(gòu)建所耗費的時間大約是原來的1/2。
- maven構(gòu)建
圖片
- mvnd構(gòu)建(并行)
圖片
- mvnd構(gòu)建(串行)
圖片
Part 03
總結(jié)
由于GraalVM的加持,這個工具很可能會延長Maven的生命,避免過早被Gradle拉開優(yōu)勢。對于我們來說,這個項目可以觀望一下,看看Apache Maven官方的進(jìn)一步動作。
??參考文獻(xiàn)
[1] maven-mvnd: https://github.com/apache/maven-mvnd.
[2] mvnd發(fā)行版?zhèn)}庫: https://github.com/mvndaemon/mvnd/releases.
[3] mvnd配置: https://github.com/mvndaemon/mvnd/blob/master/dist/src/main/distro/conf/mvnd.properties.