maven的升級版maven-mvnd的使用小結
前言
在Java代碼編譯和構建領域里面,最常見的是ant、maven、gradle。這三個編譯工具都有各自強大的功能。目前ant基本已經(jīng)被時代拋棄,主流的工具還是maven和gradle,但是gradle的服務領域大部分還是在Android開發(fā),在服務端開發(fā)方面,maven任然是主流。
但是maven也還是有很多的不足,比如基于xml格式的配置,相對應gradle來說,靈活度不夠。另外編譯時速度慢,內(nèi)存占用高等情況。為了解決編譯速度的問題,有一個maven-mvnd的工具誕生了。
一、什么是maven-mvnd
maven-mvnd和maven沒有直接的關系,它們是兩個完全獨立的的項目。但是maven-mvnd是完全兼容maven的所有特征的,使用方式和命令操作完全和maven一樣。
它最大的特點就是編譯速度快,占用內(nèi)存少,根據(jù)官方的描述可以總結為下面幾點:
- mvnd 嵌入了 Maven(因此無需單獨安裝 Maven)。
- 實際構建發(fā)生在一個長期存在的后臺進程中,也就是守護進程。
- 一個守護程序實例可以處理來自 mvnd 客戶端的多個連續(xù)請求。
- mvnd 客戶端是使用 GraalVM 構建的本機可執(zhí)行文件。與啟動傳統(tǒng) JVM 相比,它啟動速度更快,占用的內(nèi)存更少。
- 如果沒有空閑守護進程來為構建請求提供服務,則可以并行生成多個守護進程。
- 用于運行實際構建的 JVM 不需要為每個構建重新開始。
- 保存 Maven 插件類的類加載器緩存在多個構建中。因此,插件 jar 只需讀取和解析一次。不緩存 Maven 插件的 SNAPSHOT 版本。
- JVM 內(nèi)部的實時 (JIT) 編譯器生成的本機代碼也會保留。與普通 Maven 相比,JIT 編譯花費的時間更少。在重復生成期間,JIT 優(yōu)化代碼會立即可用。這不僅適用于來自 Maven 插件和 Maven Core 的代碼,也適用于來自 JDK 本身的所有代碼。
看到上面的解釋,感覺就一個字:牛B。下面我們來看看如何使用
二、maven-mvnd安裝
maven-mvnd的安裝很簡單,和maven的安裝差不多。
首先我們?nèi)ハ螺dmaven-mvnd,點擊這里進行下載
選擇合適的版本以及操作系統(tǒng)進行下載
- 下載后然后解壓到相關目錄
- 配置環(huán)境變量,在PATH中加入{maven-mvnd-path}/bin
- 如果在Linux或者Mac系統(tǒng)下,需要讓環(huán)境變量生效
然后在控制臺運行命令:
mvnd -v
如果有如下輸出,表示安裝成功:
mvnd native client 0.7.1-darwin-amd64 (97c587c11383a67b5bd0ff8388bd94c694b91c1e) Terminal: org.jline.terminal.impl.PosixSysTerminal with pty org.jline.terminal.impl.jansi.osx.OsXNativePty Apache Maven 3.8.3 (ff8e977a158738155dc465c6a97ffaf31982d739) Maven home: /Users/lihao/.sdkman/candidates/mvnd/current/mvn Java version: 17.0.9, vendor: Oracle Corporation, runtime: /Users/lihao/java/graalvm-jdk-17.0.9+11.1/Contents/Home Default locale: zh_CN_#Hans, platform encoding: UTF-8 OS name: "mac os x", version: "12.1", arch: "x86_64", family: "mac"
不同的操作系統(tǒng)會有不同的輸出結果
注意:
- Windows下面可能會報VCRUNTIME140.dll was not found的錯誤,解決辦法是安裝vc_redist.x64.exe,點擊鏈接下載
- MacOS系統(tǒng)下可能會報安全問題,在控制臺下運行如下命令進行解決:
xattr -r -d com.apple.quarantine mvnd-x.y.z-darwin-amd64
將mvnd-x.y.z-darwin-amd64替換成你實際的目錄
三、maven-mvnd打包測試
安裝成功后,我們現(xiàn)在來看看如何使用maven-mvnd操作以及打包的情況。
普通打包測試
首先我們新建一個普通springboot項目:
我們先使用maven來打包,而且我們連續(xù)打包三次,運行打包命令:
mvn clean -DskipTests package
第一次打包時間結果如下:
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.202 s
[INFO] Finished at: 2024-02-23T17:54:47+08:00
第二次打包時間結果如下:
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.811 s
[INFO] Finished at: 2024-02-23T17:55:54+08:00
第三次打包時間結果如下:
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.779 s
[INFO] Finished at: 2024-02-23T17:56:14+08:00
三次時間平均值大概在3.9秒左右。
下面我們來使用maven-mvnd來打包,maven-mvnd的使用和maven一樣,只需要把mvn命令替換成mvnd即可,運行打包命令,同樣是三次:
mvnd clean -DskipTests package
第一次打包時間結果如下:
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.026 s (Wall Clock)
[INFO] Finished at: 2024-02-23T17:58:21+08:00
第二次打包時間結果如下:
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.541 s (Wall Clock)
[INFO] Finished at: 2024-02-23T17:58:51+08:00
第三次打包時間結果如下:
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.523 s (Wall Clock)
[INFO] Finished at: 2024-02-23T17:59:07+08:00
可以看到使用maven-mvnd進行三次打包,每次消耗的時間大概在1.7秒左右。相對應maven來說時間是提升了不少
native打包測試
下面我們來測試springboot的native打包。還是上面的項目,先使用native打包:
mvn clean -DskipTests native:compile -Pnative
第一次耗時:
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:53 min
[INFO] Finished at: 2024-02-23T20:18:16+08:00
[INFO] ------------------------------------------------------------------------
第二次耗時:
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:30 min
[INFO] Finished at: 2024-02-23T20:21:02+08:00
[INFO] ------------------------------------------------------------------------
第三次耗時:
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:23 min
[INFO] Finished at: 2024-02-23T20:22:45+08:00
[INFO] ------------------------------------------------------------------------
平均耗時大概01:34 min。下面我們使用mvnd
同樣執(zhí)行命令:
mvnd clean -DskipTests native:compile -Pnative
第一次耗時:
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:26 min (Wall Clock)
[INFO] Finished at: 2024-02-23T20:25:35+08:00
[INFO] ------------------------------------------------------------------------
第二次耗時:
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:28 min (Wall Clock)
[INFO] Finished at: 2024-02-23T20:27:12+08:00
[INFO] ------------------------------------------------------------------------
第三次耗時:
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:33 min (Wall Clock)
[INFO] Finished at: 2024-02-23T20:31:58+08:00
[INFO] ------------------------------------------------------------------------
平均耗時大概01:28 min。
可以看出差異性不是很大,比較native打包消耗性能的不在maven上,而是GraalVM平臺來決定
大型項目編譯測試
下面我們使用【vertx-examples】這個項目來做測試
我們先將項目clone下來:
git clone https://github.com/vert-x3/vertx-examples.git
然后使用maven編譯項目:
mvn clean -DskipTests compile
先去掉Downloading階段的編譯,保證本地都有相關的依賴包
使用maven編譯耗時:
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for vertx-examples 4.5.0:
[INFO]
[INFO] core-examples ...................................... SUCCESS [ 1.945 s]
[INFO] opentracing-examples ............................... SUCCESS [ 0.361 s]
[INFO] zipkin-examples .................................... SUCCESS [ 0.216 s]
[INFO] web-examples ....................................... SUCCESS [ 3.285 s]
[INFO] web-client-examples ................................ SUCCESS [ 0.180 s]
[INFO] rxjava-2-examples .................................. SUCCESS [ 0.557 s]
[INFO] rxjava-3-examples .................................. SUCCESS [ 0.473 s]
[INFO] unit-examples ...................................... SUCCESS [ 0.048 s]
[INFO] metrics-examples ................................... SUCCESS [ 0.052 s]
[INFO] micrometer-metrics-examples ........................ SUCCESS [ 0.096 s]
[INFO] mail-examples ...................................... SUCCESS [ 0.074 s]
[INFO] service-proxy-examples ............................. SUCCESS [ 0.001 s]
[INFO] service-provider ................................... SUCCESS [ 0.172 s]
[INFO] service-consumer ................................... SUCCESS [ 0.075 s]
[INFO] sockjs-proxies-examples ............................ SUCCESS [ 0.133 s]
[INFO] spring-examples .................................... SUCCESS [ 0.001 s]
[INFO] spring-verticle-factory ............................ SUCCESS [ 0.137 s]
[INFO] redis-examples ..................................... SUCCESS [ 0.050 s]
[INFO] consul-examples .................................... SUCCESS [ 0.042 s]
[INFO] mongo-examples ..................................... SUCCESS [ 0.053 s]
[INFO] sql-client-examples ................................ SUCCESS [ 0.226 s]
[INFO] shell-examples ..................................... SUCCESS [ 0.167 s]
[INFO] amqp-proton-examples ............................... SUCCESS [ 0.105 s]
[INFO] camel-bridge-examples .............................. SUCCESS [ 0.298 s]
[INFO] circuit-breaker-examples ........................... SUCCESS [ 0.054 s]
[INFO] vertx-examples ..................................... SUCCESS [ 0.001 s]
[INFO] service-discovery-examples ......................... SUCCESS [ 0.075 s]
[INFO] mqtt-examples ...................................... SUCCESS [ 0.089 s]
[INFO] grpc-examples ...................................... SUCCESS [ 3.994 s]
[INFO] kafka-examples ..................................... SUCCESS [ 0.137 s]
[INFO] kotlin-coroutines-examples ......................... SUCCESS [ 4.717 s]
[INFO] junit5-examples .................................... SUCCESS [ 0.065 s]
[INFO] Web Api Service example ............................ SUCCESS [ 0.211 s]
[INFO] cassandra-examples ................................. SUCCESS [ 0.108 s]
[INFO] web-graphql-examples ............................... SUCCESS [ 0.076 s]
[INFO] jpms-examples ...................................... SUCCESS [ 0.225 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 18.843 s
[INFO] Finished at: 2024-02-23T21:27:47+08:00
[INFO] ------------------------------------------------------------------------
然后我們使用maven-mvnd來編譯:
[INFO] Reactor Summary for vertx-examples 4.5.0:
[INFO]
[INFO] core-examples ...................................... SUCCESS [ 0.730 s]
[INFO] opentracing-examples ............................... SUCCESS [ 0.314 s]
[INFO] zipkin-examples .................................... SUCCESS [ 0.375 s]
[INFO] web-examples ....................................... SUCCESS [ 3.349 s]
[INFO] web-client-examples ................................ SUCCESS [ 0.431 s]
[INFO] rxjava-2-examples .................................. SUCCESS [ 1.066 s]
[INFO] rxjava-3-examples .................................. SUCCESS [ 1.045 s]
[INFO] unit-examples ...................................... SUCCESS [ 0.160 s]
[INFO] metrics-examples ................................... SUCCESS [ 0.133 s]
[INFO] micrometer-metrics-examples ........................ SUCCESS [ 0.200 s]
[INFO] mail-examples ...................................... SUCCESS [ 0.189 s]
[INFO] service-proxy-examples ............................. SUCCESS [ 0.003 s]
[INFO] service-provider ................................... SUCCESS [ 0.678 s]
[INFO] service-consumer ................................... SUCCESS [ 0.185 s]
[INFO] sockjs-proxies-examples ............................ SUCCESS [ 0.395 s]
[INFO] spring-examples .................................... SUCCESS [ 0.002 s]
[INFO] spring-verticle-factory ............................ SUCCESS [ 0.268 s]
[INFO] redis-examples ..................................... SUCCESS [ 0.182 s]
[INFO] consul-examples .................................... SUCCESS [ 0.071 s]
[INFO] mongo-examples ..................................... SUCCESS [ 0.091 s]
[INFO] sql-client-examples ................................ SUCCESS [ 0.829 s]
[INFO] shell-examples ..................................... SUCCESS [ 0.444 s]
[INFO] amqp-proton-examples ............................... SUCCESS [ 0.289 s]
[INFO] camel-bridge-examples .............................. SUCCESS [ 0.629 s]
[INFO] circuit-breaker-examples ........................... SUCCESS [ 0.111 s]
[INFO] vertx-examples ..................................... SUCCESS [ 0.003 s]
[INFO] service-discovery-examples ......................... SUCCESS [ 0.177 s]
[INFO] mqtt-examples ...................................... SUCCESS [ 0.247 s]
[INFO] grpc-examples ...................................... SUCCESS [ 5.308 s]
[INFO] kafka-examples ..................................... SUCCESS [ 0.427 s]
[INFO] kotlin-coroutines-examples ......................... SUCCESS [ 1.570 s]
[INFO] junit5-examples .................................... SUCCESS [ 0.079 s]
[INFO] Web Api Service example ............................ SUCCESS [ 0.752 s]
[INFO] cassandra-examples ................................. SUCCESS [ 0.259 s]
[INFO] web-graphql-examples ............................... SUCCESS [ 0.290 s]
[INFO] jpms-examples ...................................... SUCCESS [ 0.221 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.778 s (Wall Clock)
[INFO] Finished at: 2024-02-23T21:29:11+08:00
[INFO] ------------------------------------------------------------------------
可以看出在復雜的項目編譯時,maven-mvnd的優(yōu)勢還是很大。
總結
maven-mvnd的使用方式和maven沒有多大區(qū)別,直接使用mvnd命令替換mvn即可。
小項目編譯時這兩個的差異是很小的,但在大型項目的情況下,maven-mvnd的優(yōu)勢還是很明顯。
maven-mvnd主要是對Java代碼編譯做性能優(yōu)化。但對第三方的插件應該不會有性能提升。因為插件的執(zhí)行效率還是依賴于插件本身的執(zhí)行邏輯。
到此這篇關于maven的升級版maven-mvnd的使用小結的文章就介紹到這了,更多相關maven-mvnd使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java自帶定時任務ScheduledThreadPoolExecutor實現(xiàn)定時器和延時加載功能
今天小編就為大家分享一篇關于Java自帶定時任務ScheduledThreadPoolExecutor實現(xiàn)定時器和延時加載功能,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12Spring Security靈活的PasswordEncoder加密方式解析
這篇文章主要介紹了Spring Security靈活的PasswordEncoder加密方式解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09SpringBoot中AOP的動態(tài)匹配和靜態(tài)匹配詳解
這篇文章主要介紹了SpringBoot中AOP的動態(tài)匹配和靜態(tài)匹配詳解,在創(chuàng)建代理的時候對目標類的每個連接點使用靜態(tài)切點檢查,如果僅通過靜態(tài)切點檢查就可以知道連接點是不匹配的,則在運行時就不再進行動態(tài)檢查了,需要的朋友可以參考下2023-09-09SpringBoot+Vue前后端分離實現(xiàn)請求api跨域問題
這篇文章主要介紹了SpringBoot+Vue前后端分離實現(xiàn)請求api跨域問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-06-06springboot使用JdbcTemplate完成對數(shù)據(jù)庫的增刪改查功能
這篇文章主要介紹了springboot使用JdbcTemplate完成對數(shù)據(jù)庫的增刪改查功能,需要的朋友可以參考下2017-12-12