maven的升级版maven-mvnd的使用小结

 更新时间:2025年01月02日 11:15:40   作者:流年五十前  
maven-mvnd是Maven的升级版,通过将构建过程放在守护进程中,实现了更快的编译速度和更低的内存占用,下面就来介绍一下如何使用,感兴趣的可以了解一下

前言

在Java代码编译和构建领域里面,最常见的是ant、maven、gradle。这三个编译工具都有各自强大的功能。目前ant基本已经被时代抛弃,主流的工具还是maven和gradle,但是gradle的服务领域大部分还是在Android开发,在服务端开发方面,maven任然是主流。
但是maven也还是有很多的不足,比如基于xml格式的配置,相对应gradle来说,灵活度不够。另外编译时速度慢,内存占用高等情况。为了解决编译速度的问题,有一个maven-mvnd的工具诞生了。

一、什么是maven-mvnd

maven-mvnd和maven没有直接的关系,它们是两个完全独立的的项目。但是maven-mvnd是完全兼容maven的所有特征的,使用方式和命令操作完全和maven一样。
它最大的特点就是编译速度快,占用内存少,根据官方的描述可以总结为下面几点:

  • mvnd 嵌入了 Maven(因此无需单独安装 Maven)。
  • 实际构建发生在一个长期存在的后台进程中,也就是守护进程。
  • 一个守护程序实例可以处理来自 mvnd 客户端的多个连续请求。
  • mvnd 客户端是使用 GraalVM 构建的本机可执行文件。与启动传统 JVM 相比,它启动速度更快,占用的内存更少。
  • 如果没有空闲守护进程来为构建请求提供服务,则可以并行生成多个守护进程。
  • 用于运行实际构建的 JVM 不需要为每个构建重新开始。
  • 保存 Maven 插件类的类加载器缓存在多个构建中。因此,插件 jar 只需读取和解析一次。不缓存 Maven 插件的 SNAPSHOT 版本。
  • JVM 内部的实时 (JIT) 编译器生成的本机代码也会保留。与普通 Maven 相比,JIT 编译花费的时间更少。在重复生成期间,JIT 优化代码会立即可用。这不仅适用于来自 Maven 插件和 Maven Core 的代码,也适用于来自 JDK 本身的所有代码。

看到上面的解释,感觉就一个字:牛B。下面我们来看看如何使用

二、maven-mvnd安装

maven-mvnd的安装很简单,和maven的安装差不多。
首先我们去下载maven-mvnd,点击这里进行下载

选择合适的版本以及操作系统进行下载

  • 下载后然后解压到相关目录
  • 配置环境变量,在PATH中加入{maven-mvnd-path}/bin
  • 如果在Linux或者Mac系统下,需要让环境变量生效

然后在控制台运行命令:

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"

不同的操作系统会有不同的输出结果

注意:

  • Windows下面可能会报VCRUNTIME140.dll was not found的错误,解决办法是安装vc_redist.x64.exe,点击链接下载
  • MacOS系统下可能会报安全问题,在控制台下运行如下命令进行解决:
xattr -r -d com.apple.quarantine mvnd-x.y.z-darwin-amd64

将mvnd-x.y.z-darwin-amd64替换成你实际的目录

三、maven-mvnd打包测试

安装成功后,我们现在来看看如何使用maven-mvnd操作以及打包的情况。

普通打包测试

首先我们新建一个普通springboot项目:

我们先使用maven来打包,而且我们连续打包三次,运行打包命令:

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

同样执行命令:

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的优势还是很大。

总结

maven-mvnd的使用方式和maven没有多大区别,直接使用mvnd命令替换mvn即可。

小项目编译时这两个的差异是很小的,但在大型项目的情况下,maven-mvnd的优势还是很明显。

maven-mvnd主要是对Java代码编译做性能优化。但对第三方的插件应该不会有性能提升。因为插件的执行效率还是依赖于插件本身的执行逻辑。

到此这篇关于maven的升级版maven-mvnd的使用小结的文章就介绍到这了,更多相关maven-mvnd使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java自带定时任务ScheduledThreadPoolExecutor实现定时器和延时加载功能

    Java自带定时任务ScheduledThreadPoolExecutor实现定时器和延时加载功能

    今天小编就为大家分享一篇关于Java自带定时任务ScheduledThreadPoolExecutor实现定时器和延时加载功能,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Spring Security灵活的PasswordEncoder加密方式解析

    Spring Security灵活的PasswordEncoder加密方式解析

    这篇文章主要介绍了Spring Security灵活的PasswordEncoder加密方式解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • SpringBoot中AOP的动态匹配和静态匹配详解

    SpringBoot中AOP的动态匹配和静态匹配详解

    这篇文章主要介绍了SpringBoot中AOP的动态匹配和静态匹配详解,在创建代理的时候对目标类的每个连接点使用静态切点检查,如果仅通过静态切点检查就可以知道连接点是不匹配的,则在运行时就不再进行动态检查了,需要的朋友可以参考下
    2023-09-09
  • 使用Netty解决TCP粘包和拆包问题过程详解

    使用Netty解决TCP粘包和拆包问题过程详解

    这篇文章主要介绍了使用Netty解决TCP粘包和拆包问题过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • IDEA 2019.2.3破解激活教程(亲测有效)

    IDEA 2019.2.3破解激活教程(亲测有效)

    这篇文章主要介绍了IDEA 2019.2.3破解激活教程(亲测有效),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • SpringBoot+Vue前后端分离实现请求api跨域问题

    SpringBoot+Vue前后端分离实现请求api跨域问题

    这篇文章主要介绍了SpringBoot+Vue前后端分离实现请求api跨域问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • 全面剖析java中的注解(Annotation)

    全面剖析java中的注解(Annotation)

    一个词就可以描述注解,那就是元数据,即一种描述数据的数据。所以,可以说注解就是源代码的元数据。文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Java对象创建内存案例解析

    Java对象创建内存案例解析

    这篇文章主要介绍了Java对象创建内存案例解析,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • springboot添加AOP日志配置详解

    springboot添加AOP日志配置详解

    这篇文章主要介绍了springboot添加AOP日志配置详解,日志是一种在软件开发中常用的技术,用于记录和跟踪应用程序的运行过程,通过AOP日志,开发人员可以实时监控应用程序的行为,包括方法的调用、参数的传递和返回值的获取等,需要的朋友可以参考下
    2023-10-10
  • springboot使用JdbcTemplate完成对数据库的增删改查功能

    springboot使用JdbcTemplate完成对数据库的增删改查功能

    这篇文章主要介绍了springboot使用JdbcTemplate完成对数据库的增删改查功能,需要的朋友可以参考下
    2017-12-12

最新评论