五分鐘技術趣談 | mvnd:更快的maven來了
Labs 導讀
Maven和Gradle都是我們程序猿們日常開發必不可少的構建工具,但兩者還是有很大的不同之處的:1.可擴展性,Gradle比較靈活,maven的靈活性就差一些,但是maven的項目比較容易看懂,并且上手簡單;2.性能比較,Gradle比maven運行得快。Gradle無論是在可擴展性還是在性能方面都優于Maven。
相信作為Java開發者的你早已經受夠了maven的編譯緩慢,但是又由于歷史包袱、使用習慣等問題暫時切換不了其他更快的構建工具,這里介紹一款更快的Maven——maven-mvnd[1]。
Part 01
介紹
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參數切換到串行構建。
Part 02
簡單嘗試
- 安裝
目前mvnd已經支持Linux、MacOS、Windows平臺。你可以分別通過SDKMAN、Homebrew、Chocolatey這些包管理器進行安裝。也可以直接去mvnd發行版倉庫[2]下載對應的二進制進行安裝。這里以Windows為例,小編選擇 從mvnd發行版倉庫[2]下載壓縮包,如下圖所示:
圖片
選擇下載 maven-mvnd-1.0-m6-m40-windows-amd64.zip版本。
- 配置
配置很簡單,只需要注意幾點:
如果不使用包管理器進行安裝的話請確保mvnd的bin目錄關聯到PATH。
解壓后修改配置文件,修改conf/mvnd.properties。拉到底部修改settings文件目錄,可以指向原安裝maven中的xml文件,也可單獨放到一個目錄中。
圖片
如果沒有配置或者不想配置JAVA_HOME環境變量的話請在~/.m2/mvnd.properties中設置java.home以指定Java目錄,例如:java.home=C:\\AdoptOpenJDK\\jdk-8。已經配置環境變量的請忽略該條。
其他配置可參考mvnd配置[3]。
- 驗證
環境變量配置完成,在cmd的任意地址,可以識別到bin下的 mvnd 命令輸入mvnd -version查看版本信息,輸出如下信息代表安裝成功!
圖片
- 使用
在使用上與Maven的用法是完全相同的,只需將命令mvn改為mvnd即可。而在筆者本機的實測中,與傳統的Maven相比,通過mvnd的構建所耗費的時間大約是原來的1/2。
- maven構建
圖片
- mvnd構建(并行)
圖片
- mvnd構建(串行)
圖片
Part 03
總結
由于GraalVM的加持,這個工具很可能會延長Maven的生命,避免過早被Gradle拉開優勢。對于我們來說,這個項目可以觀望一下,看看Apache Maven官方的進一步動作。
??參考文獻
[1] maven-mvnd: https://github.com/apache/maven-mvnd.
[2] mvnd發行版倉庫: https://github.com/mvndaemon/mvnd/releases.
[3] mvnd配置: https://github.com/mvndaemon/mvnd/blob/master/dist/src/main/distro/conf/mvnd.properties.