比Maven快2~10倍的编译工具mvnd简介与实战

概述

maven-mvnd,可简称(或缩写)mvnd,the Maven Daemon。Apache Maven团队借鉴Gradle和Takari后开发的更快的构建工具。mvnd内嵌Maven,开发者可无缝从Maven迁移到mvnd。

参考资料:GitHub。

mvnd中会启动一个或多个守护进程,用来执行实际的构建服务。一个守护进程实例可以为来自mvnd客户端的多个连续请求提供Maven构建服务。当没有空闲的守护进程时来支撑构建请求时,mvnd可以并行生成多个守护程序。

mvnd使用GraalVM代替传统的JVM,GraalVM启动速度更快,占用的内存更少,在实行构建时不需要为每个构建启动新的JVM。GraalVM的JIT(Just In Time)实时编译特性也被运用到Maven构建作业中。JIT可大大减少编译时间,在重复构建过程中,JIT优化代码立即可用,也极大提高构建效率。

另外Maven插件在构建时不再需要多次加载,而是缓存在多个构建中。SNAPSHOT版本的Maven插件不会被缓存。

默认情况下,mvnd使用多个CPU内核并行构建模块。使用的内核数公式Math.max(Runtime.getRuntime().availableProcessors() - 1, 1)。如果代码不支持并行构建,在命令行添加-T1参数切换到串行构建。

相比Maven,mvnd的优势:

  • 运行构建的JVM不需要为每个构建重新启动;
  • Maven插件类的类加载器缓存在多个构建中,插件jars只会被读取和解析一次;
  • JVM中JIT生成的本机代码会被保留。与Maven相比,JIT编译花费的时间更少。在重复构建期间,JIT优化的代码立即可用。这不仅适用于来自Maven插件和Maven内核的代码,也适用于来自JDK本身的所有代码。

安装使用

下载地址,读者根据各自的操作系统选择。本文选择Windows系统1.0.1版本,这里选择下载zip压缩包(另外还有tar.gz压缩包)。解压缩后,将目录名maven-mvnd-1.0.1-windows-amd64重命名为mvnd-1.0.1

目录如下:
在这里插入图片描述
进入到mvn目录下,发现和之前的Maven目录设置没有区别:
在这里插入图片描述
配置环境变量和之前使用Maven没有区别,过程略。与Maven的命令完全相同,改为mvnd即可:
在这里插入图片描述
mvnd与Maven互不干扰。

默认情况下,Maven下载的JAR包存放在C盘目录下,但C盘一般都是SSD,空间有限。于是会修改Maven的settings.xml配置文件,将JAR包放到D盘:

<localRepository>D:\maven\repository</localRepository>

在Maven项目工程里,即pom.xml文件所在目录里执行命令:mvnd clean -Dquickly,却发现mvnd在下载各种依赖JAR包,这些不应该早就下载好了吗?
在这里插入图片描述
发现C盘.m2目录下,确实多了个repository目录。与此同时,发现还有另一个目录:
在这里插入图片描述
看到这个daemon日志文件,也印证着上文所述:mvnd中会启动一个或多个守护进程。

想到在使用Maven时,需配置settings.xml文件。mvnd是不是也需要配置文件?

于是,找到mvnd安装目录conf下的mvnd.properties配置文件。分析此文件,不难发现最后一个配置项maven.settings,用于指定settings.xml文件路径:

# The location of the maven settings file. The client normally uses default settings in {@code ~/.m2/settings.xml}.
# maven.settings=<path>

于是删除注释符,修改配置为:maven.settings=D:\maven\settings.xml,再次执行命令mvnd clean -Dquickly,结果报错:
在这里插入图片描述
分析报错,缺少转义字符?

尝试修改配置为:maven.settings=D:\\maven\\settings.xml,执行成功。

性能对比

Maven官宣,mvnd比Maven编译速度快。

此处暂时给不出严谨的对比数据,但是可以执行两条命令来验证一下是否如此(当然截图也不一定就肯定正确)。

另外,如上面某个截图所示,我使用的Maven版本为3.6.3,不算低(好吧,最新版是3.9.9,有点低了);mvnd版本为1.0.1,是最新版。

首先看clean -Dquickly命令。

某一次mvn clean -Dquickly执行结果截图:
在这里插入图片描述
耗时0.69s。不明白为何此处使用maven-clean-plugin2.5这么低的插件版本。

某一次mvnd clean -Dquickly执行结果截图:
在这里插入图片描述
耗时0.076s!是mvn clean命令耗时的10%。另外,多了个括号,Wall Clock。

再来看compile -Dquickly命令。

某一次mvn compile -Dquickly执行结果截图:
在这里插入图片描述
编译过程出现两个插件maven-resources-pluginmaven-compiler-plugin,耗时3.867s。

某一次mvnd compile -Dquickly执行结果截图:
在这里插入图片描述
编译耗时0.996,是mvn compile命令耗时的26%。另外上图编译过程中出现乱码。

声明:截图都是某一次执行结果。

事实上,反复多次执行,完全可以得出mvnd比mvn快不止2倍的结论。另外,mvnd.properties文件里还有很多配置项可以优化编译过程。

Wall Clock

参考Wall Clock and Monotonic Clock。

Wall Clock就是一般意义上的时间。

Monotonic Clock,单调时间,实际上它指的是从某个点开始后(如系统启动以后)流逝的时间,一定是单调递增的。

计算两个时间点的差值一定要用Monotonic Clock,因为Wall clock是可以被修改的,如计算机时间被回拨(比如校准或者人工回拨等情况),或闰秒(Leap Second),会导致两个Wall Clock可能出现负数。

因为操作系统或上层应用不一定完全支持闰秒,出现闰秒后系统时间会在后续某个点会调整为正确值,就有可能出现时钟回拨。当然也不一定,比如ntpdate就有可能出现时钟回拨,但ntpd就不会。

中文乱码

理论上,IDEA里Terminal控制台,mvn或mvnd命令基于如下maven-compiler-plugin配置:

<build><pluginManagement><plugins><plugin><!--by default groupId is org.apache.maven.plugins--><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.13.0</version><configuration><source>22</source><target>22</target><encoding>UTF-8</encoding><showWarnings>true</showWarnings></configuration></plugin></plugins></pluginManagement>
</build>

而这个配置是没有问题的,为啥mvnd还是会出现中文乱码呢?

反复查看mvnd.properties配置文件,也没找到跟编码相关的配置项。

TODO:待解决。

现在时间:2024年8月24日01:59:18。老命要紧

日志解读

C盘目录下,类似于daemon-cbaabd83.log日志文件:

Dispatch message: KeepAlive
Dispatch message: ProjectStopped{payload='yaml_groovy'}
Dispatch message: BuildFinished{exitCode=0}
No more message to dispatch
Daemon back to idle
Updating state to: Idle

在这里插入图片描述
然后在日志文件里发现如上图所示,也就是说mvnd命令没有问题,IDEA的Terminal控制台展示中文乱码?展示mvn命令正常?

daemon-cbaabd83.out.log日志文件:

Starting daemon process: id = 8284f806, workingDir = E:\Java\maven\mvnd-1.0.1, daemonArgs: -classpath

都是些命令启动参数。

配置解读

参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/408453.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构篇】~二叉树(堆)

【数据结构篇】~二叉树&#xff08;堆&#xff09; 二叉树1.树2.树的组成3.二叉树4.堆1.向上调整算法2.向下调整算法3.堆排序 4.topk问题源码 二叉树 1.树 树的概念与结构​ 树是一种非线性的数据结构&#xff0c;它是由 n&#xff08;n>0&#xff09; 个有限结点组成一个…

BUG——GT911上电后中断一直触发

版型&#xff1a;正点原子 I.MX6UL MINI板 屏幕&#xff1a;7寸 1024*600 ATK-MD0700R V1.4 我的建议是买7寸屏幕就不要Mini板&#xff0c;因为Mini板太小装不下7寸屏幕&#xff0c;你需要一个更大的板子 简介&#xff1a; 算是作为一个后来者对这一现象的补充。解决方案就…

linux memory cgroup的memory.move_charge_at_immigrate含义

1.内核文档 上面的例子说明&#xff1a; 最开始某个进程是在cgroup A中&#xff0c;后面要迁移到cgroup B中&#xff0c;那么进程的内存计数是否要完全迁入B中&#xff0c;就是通过memory.move_charge_at_immigrate控制&#xff0c;如果目标cgroup也就是B设置了1到该字段中&am…

DBeaver安装使用

文章目录 简介支持的数据库支持的系统 下载安装DBeaver使用修改Maven下载jar地址窗口->首选项连接->驱动->Maven配置仓库地址 选择需要连接的数据库进行连接 简介 DBeaver 是一个通用的数据库管理工具和 SQL 客户端&#xff0c;支持 MySQL, PostgreSQL, Oracle, DB2,…

进存销系统

摘 要 伴随着我国全面推动信息化的趋势&#xff0c;我国的很多行业都在朝着互联网的方向进发。商品销售行业也有很多挑战。这次论文介绍的进存销系统就是为了能够解决当前传统商品进存销存在的问题&#xff0c;使得商品进存销能够更加有效率。电商智能化管理必不可少的帮手有进…

【VIsion Master】机器视觉软件二次开发(C#版本)学习笔记

0.前言 最近接手新项目&#xff0c;用海康威视旗下的HIK ROBOT Vision Master机器视觉软件做二次开发相关的项目&#xff0c;写一篇博客记录一下学习过程。 参考视频&#xff1a;https://www.bilibili.com/video/BV1tq4y1j7RP?p1 其他参考资料&#xff1a;软件自带的开发文档…

学习2d直线拟合-2

参考文章 直线拟合算法&#xff08;续&#xff1a;加权最小二乘&#xff09;_加权拟合直线法-CSDN博客 对比了参考文中和opencv中的直线拟合权重&#xff0c;不知道理解的对不对&#xff0c;前者是权重平方&#xff0c;后者没有平方 QtWidgetsApplication1::QtWidgetsApplic…

Excel中的“块”操作

在Excel中&#xff0c;有offset、index、indirect三个对“区域”操作的函数&#xff0c;是较高版本Excel中“块”操作的利器。 (笔记模板由python脚本于2024年08月20日 19:25:21创建&#xff0c;本篇笔记适合喜欢用Excel处理数据的coder翻阅) 【学习的细节是欢悦的历程】 Pytho…

幅频特性曲线分析及使用WPF绘制

文章目录 1、一阶惯性环节的幅频特性曲线分析及绘制2、二阶系统的幅频特性曲线分析及绘制3、一般的系统4、上位机代码实现4.1 一阶惯性系统4.2 二阶系统 5、稳定裕度5.1 幅值裕度5.2 相角裕度 参考 1、一阶惯性环节的幅频特性曲线分析及绘制 这里的a和b可以根据系统的不同修改,…

网络udp及ipc内存共享

大字符串找小字符串 调试 1. 信号处理函数注册&#xff1a;•一旦使用 signal 函数注册了信号处理函数&#xff0c;该函数就会一直有效&#xff0c;直到程序结束或者显式地取消注册。2. 注册多次的影响&#xff1a;•如果多次注册同一信号的处理函数&#xff0c;最后一次注册的…

【记录】基于Windows系统安装rust环境的过程

到官网下载安装包【入门 - Rust 程序设计语言 (rust-lang.org)】 ![[Pasted image 20240703142911.png]] 选择1&#xff0c;快速安装 选择编译配置&#xff0c;1为标准 安装完成 验证是否安装完毕 rustc --versioncargo --version验证成功&#xff01;

UneMeta创始人讲述自己在Web3+IP领域创业的心路历程

昨日&#xff0c;UneMeta创始人&#xff0c;Ann_tyrion在X分享了一篇推文&#xff0c;分享了自己在探索Web3与IP产业结合过程中的心路历程&#xff0c;她并没有像很多项目方那样一味的讲述宏大的叙事&#xff0c;而是字里行间透露出对这个行业的探索和不断给自己充实信念&#…

自动操作一键数据恢复/电子取证

对磁盘模拟扫描修复丢失数据的实验。 先挂载题目磁盘VHD。 Windows系统中打开磁盘管理&#xff0c;-操作&#xff0c;-附加VHD 可以看到已经加载出题目磁盘&#xff0c;接下来打开RStudio数据恢复软件&#xff0c;对其进行扫描。 操作找回丢失/被删除的数据 可以看到已经加载出…

DRF——pagination分页模块

文章目录 分页继承APIView类用法1.PageNumberPagination2.LimitOffsetPagination3.CursorPagination 继承GenericAPIView派生类用法1.PageNumberPagination2.LimitOffsetPagination3.CursorPagination 分页 在查看数据列表的API中&#xff0c;如果 数据量 比较大&#xff0c;肯…

【前端基础篇】JavaScript之DOM介绍

文章目录 WebAPI背景知识什么是WebAPI什么是APIAPI参考文档 DOM基本概念什么是DOMDOM树查找HTML元素方法概览1. document.getElementById(id)2.document.getElementsByTagName(name)3. document.getElementsByClassName(name)4. document.querySelector(CSS选择器)5. document.…

如何免费获取乡镇级边界数据geoJson数据

如何免费获取乡镇级边界数据geoJson数据 我们可以通过 阿里云数据可视化平台 &#xff0c;可以获取到中国各个省份/区级/县级的json数据&#xff0c;但是区级和县级&#xff0c;并没有包含街道和乡镇的数据 获取乡镇级边界数据 1.下载bigemap全能版 安装好后选择你要导出的…

Graphpad Prism for Mac 医学绘图软件教程

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功 三、运行测试安装完成&#xff01;&#xff01;&#xff01; 效果 一、下载软件 下载软件…

关于jupyter notebook 的输出 (outputs )

jupyter notebook 的输出 (outputs )在元素达到一定的个数后&#xff0c;就会按一行一个元素进行展示&#xff0c;百来个还好&#xff0c;一旦过千&#xff0c;那滚轮势必撸冒烟&#xff0c;所以能不能解决呢&#xff1f; 先看个例子&#xff0c; 一个找质数、合数的函数 cal3&…

开发高质量PDF应用的不二选择:PdfiumViewer库详细解析

1. PdfiumViewer库简介 PdfiumViewer是一款基于谷歌开源PDF渲染引擎PDFium的.NET库&#xff0c;主要用于在Windows应用程序中显示和处理PDF文档。PdfiumViewer提供了多种API和控件&#xff0c;使得开发者可以轻松地将PDF文档嵌入到其应用程序中。同时&#xff0c;PdfiumViewer…

unity游戏开发——(细)深入解析 Unity 地形系统:从基础到高级应用

Unity游戏开发 “好读书&#xff0c;不求甚解&#xff1b;每有会意&#xff0c;便欣然忘食。” 本文目录&#xff1a; Unity游戏开发 Unity游戏开发前言深入解析 Unity 地形系统&#xff1a;从基础到高级应用一、初识 Unity 地形系统1. 地形尺寸与分辨率 二、地形编辑工具详解1…