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

news2024/9/20 18:40:21

概述

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.coloradmin.cn/o/2069441.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ | Leetcode C++题解之第368题最大整除子集

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> largestDivisibleSubset(vector<int>& nums) {int len nums.size();sort(nums.begin(), nums.end());// 第 1 步&#xff1a;动态规划找出最大子集的个数、最大子集中的最大整数vect…

『基础』线性代数-1行列式

行列式是什么-运算规则 排列&#xff1a;不同的 n 元排列共有 n! 个 逆序&#xff1a;小数排在大数后面&#xff0c;叫逆序&#xff1b;一个排列中逆序的总和叫做这个排列的逆序数&#xff0c;记为 τ ( j 1 , . . . , j n ) \tau(j_1,...,j_n) τ(j1​,...,jn​) 逆序数的计…

MySQL笔记01: MySQL入门_1.2 MySQL下载安装与配置

2.2 MySQL下载安装与配置 2.2.1 MySQL下载 MySQL中文官网&#xff1a;https://www.mysql.com/cn/ MySQL英文官网&#xff1a;https://www.mysql.com/ MySQL官网下载地址&#xff1a;https://www.mysql.com/downloads/ &#xff08;1&#xff09;点击“MySQL Community (GPL) Do…

WPF—画刷(使用画刷实现背景颜色渐变效果)

WPF—画刷(使用画刷实现背景颜色渐变效果) 在WPF中我们可以使用画刷来对我们的页面做出各种炫丽的效果&#xff0c;列如渐变&#xff0c;渲染等&#xff0c; 下列就为大家分享2个渐变效果示例&#xff1a; 实例1(由内到外) <Grid><!--背景颜色渐变 画刷--><G…

【项目】微服务及时通讯系统:编写核心类

文章目录 前言1. 核心数据结构1.1 用户信息1.2 会话信息1.3 消息信息 2. 建立目录3. 编写代码3.1 用户信息3.2 会话信息3.3 消息信息3.4 工具函数 4. data.h 完整代码总结 前言 在构建现代微服务架构的即时通讯系统时&#xff0c;核心数据结构的设计是至关重要的。它们不仅决定…

聊一聊AI能够应用在哪些地方

AI大模型的应用场景极为广泛&#xff0c;涵盖了众多行业和领域&#xff0c;以下是一些主要的应用场景&#xff1a; 1. 自然语言处理&#xff08;NLP&#xff09; 对话系统&#xff1a;如智能客服、虚拟助手等&#xff0c;通过自然语言与用户进行交互&#xff0c;提供信息查询…

探索AI大模型量化前沿技术:引领智能计算新潮流

大型语言模型&#xff08;LLMs&#xff09;通常因为体积过大而无法在消费级硬件上运行。这些模型可能包含数十亿个参数&#xff0c;通常需要配备大量显存的GPU来加速推理过程。 因此越来越多的研究致力于通过改进训练、使用适配器等方法来缩小这些模型的体积。在这一领域中&am…

【CAN总线测试】——通讯相关诊断测试

从0开始学习CANoe使用 从0开始学习车载测试 相信时间的力量 星光不负赶路者&#xff0c;时光不负有心人。 目录 1.节点超时故障 2.Busoff故障码测试 3.Busoff 状态下超时故障监测测试 4.欠压故障测试 5.过压故障测试 1.节点超时故障 用例编号 TG4_TC1 测试目的 检测D…

从零开始搭建 LVS 高可用集群 (单机)

从零开始搭建 LVS 高可用集群 (单机) 背景 从零开始搭建 LVS 高性能集群 (DR模式) 从零开始搭建 KeepalaivedLvs 高可用集群 &#xff08;Aliyun部署&#xff09; 经过前面2篇关于lvs集群部署文章&#xff0c;相信跟着部署文档&#xff0c;实际部署过集群的大家对lvs服务有了…

【html+css 绚丽Loading】000015 九转轮回珠

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽Loading&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495…

Total Uninstall - 专业 Windows 卸载清理工具,让软件卸载更彻底

Total Uninstall 是一款专业的卸载清理工具&#xff0c;可帮助我们无残留卸载各类软件。 这款工具相当强大&#xff0c;卸载能做到彻底清除软件痕迹&#xff0c;同时具备软件分析、安装记录、系统清理、软件备份搬家等多种功能。 软件支持买前免费试用&#xff0c;感兴趣的朋友…

新疆旅游今年为什么这么火热?

今年新疆旅游火爆全网&#xff0c;不夸张的说&#xff0c;打开朋友圈&#xff0c;几乎一半人在新疆旅游、还有一半人在去新疆旅游的路上。 大家也纷纷在小红书上晒出新疆相关的笔记&#xff0c;覆盖旅游、美食、穿搭、养生、摄影等众多热门行业&#xff0c;相关话题多次登上小…

MySQL从入门到精通(第5-8章)

文章目录 5 排序与分页5.1 排序数据5.1.1 排序规则5.1.2 单列排序5.1.3 多列排序 5.2 分页5.2.1 实现规则5.2.2 拓展 6 多表查询6.1 笛卡尔积6.1.1 笛卡尔积&#xff08;或交叉连接&#xff09;的理解6.1.2 笛卡尔积可能存在的问题与解决 6.2 多表查询分类讲解6.2.1 等值连接与…

AI如何让销售更智能更精确?AI赋能销售的全流程深度解析

前言 随着人工智能&#xff08;AI&#xff09;技术的迅速发展&#xff0c;AI已经渗透到各个行业&#xff0c;尤其是在销售领域&#xff0c;AI正通过智能化外呼系统与CRM&#xff08;客户关系管理&#xff09;系统的结合&#xff0c;极大提升了企业的销售效率。在这篇文章中&am…

C++动态规划及九种背包问题

目录 目录 一&#xff0c;动态规划 一&#xff09;&#xff0c;动态规划的定义 二&#xff09;&#xff0c;动态规划其他的相关概念&#xff08;也是使用条件&#xff09; 1&#xff0c;重叠子问题 2&#xff0c; 最优子结构 3&#xff0c;无后效性 三&#xff09;&…

C++ 设计模式——观察者模式

观察者模式 观察者模式主要组成部分例一&#xff1a;工作流程第一步&#xff1a;定义观察者接口第二步&#xff1a;定义主题接口第三步&#xff1a;实现具体主题第四步&#xff1a;实现具体观察者第五步&#xff1a;主函数UML 图UML 图解析 例二&#xff1a;工作流程第一步&…

rocky linux配置说明

下载&#xff1a; 目前最新版的 v9.4 镜像 Download - Rocky Linux 可以在官网下载&#xff0c;不过挺慢的&#xff0c;可以试试阿里云的https://mirrors.aliyun.com/rockylinux/会稍快点 安装&#xff1a; 其步骤和centos基本一样&#xff0c;其中磁盘分区模式是gpt这个并未…

Ingress Nginx Controller

Kubernetes集群 服务暴露 Nginx Ingress Controller 一、ingress控制器 1.1 ingress控制器作用 &#xff08;类似于slb&#xff0c;做代理服务&#xff09; ingress controller可以为kubernetes 集群外用户访问Kubernetes集群内部pod提供代理服务。 提供全局访问代理访问流…

【大模型LLM第九篇】高效的微调方式:Self-Evolved多样性数据采样

前言 来自阿里巴巴和北京大学的文章&#xff1a;Self-Evolved Diverse Data Sampling for Efficient Instruction Tuning link&#xff1a;https://arxiv.org/pdf/2311.08182 github&#xff1a;https://github.com/OFA-Sys/DiverseEvol 一、摘要 提升大型语言模型的指令遵循能…

鸿蒙Harmony开发——设备发烫问题分析

&#xff1b; 本文字数&#xff1a;4207字 预计阅读时间&#xff1a;25分钟 设备过热问题是影响用户体验和设备性能的重要因素。过热不仅会导致性能下降&#xff0c;还可能损坏硬件。因此&#xff0c;开发者需要及时发现、分析并解决这一问题。本文将首先介绍评估设备过热的关键…