更快的Maven来了,我的天,速度提升了8倍!

f5b169d1b2d727cf6a28229a9c19330b.png

作者 | 王磊

来源 | Java中文社群(ID:javacn666)

转载请联系授权(微信ID:GG_Stone)

周末被 maven-mvnd 刷屏了,于是我也下载了一个 mvnd 体验了一把。虽然测试的数据都是基于我本地项目,不具备普适性和权威性,但也足以说明问题。它的测试结果远远超出我的预期,下面一起来看。

什么是 mvnd?

mvnd 是 Maven Daemon 的缩写 ,翻译成中文就是 Maven 守护进程。

mvnd 是 apache/maven 的一个子项目,它并不是一个全新的构建工具,而是对 maven 的扩展。它内置了 maven,其实现原理是构建了一个或者多个 maven 守护进程来执行构建服务。

mvnd 概述

1.mvnd 的目标是使用 Gradle 和 Takari 所知的技术提供更快的 Maven 构建。

Gradle 是一个基于 Apache Ant 和 Apache Maven 概念的项目自动化建构工具。Gradle 构建脚本使用的是 Groovy 或 Kotlin 的特定领域语言来编写的,而不是传统的 XML。Gradle 最大的优势就是比传统的 Maven 构建速度更快。Takari 是 maven-wrapper 核心,大部分的开源项目都是提供 warpper 方便用户不安装 maven 的前提下快速构建项目的。

2.mvnd 内嵌了 Maven,所以不需要单独安装 Maven 了。

3.一个守护进程实例可以服务于来自 mvnd 客户端的多个连续请求。 

4.mvnd 客户端使用 GraalVM 构建本地可执行文件,与启动传统 JVM 相比,它启动得更快,占用的内存更少。 

5.如果 mvnd 没有空闲守护进程来服务一个构建请求,可以并行地生成多个守护进程。

mvnd 优点介绍

mvnd 具有以下优点:

  1. 用于运行构建的 JVM 不需要每次构建都重新启动。

  2. 持有 Maven 插件类的类加载器在多个构建中会被缓存。因此,插件 jar 文件只被读取和解析一次。(快照版本的 Maven 插件不会被缓存)

  3. JVM 中即时(JIT)编译器生成的本地代码也被保留,与常规 Maven 相比,JIT 编译所花费的时间更少。在重复构建期间,JIT 优化的代码立即可用,这不仅适用于来自 Maven 插件和 Maven Core的代码,也适用于所有来自 JDK 本身的代码。

mvnd 安装

mvnd 支持 Window、Linux、Macos,本文以 Windows 安装为例。

1.下载并解压 mvnd

下载地址:https://github.com/apache/maven-mvnd/releases选择最新版的 Windows 资源包,如下图所示:a6d348a9bf83a29b61d6ae830517aab9.png

下载完成之后,解压到本地的某个目录,如下图所示:5fccf6394b83daef1553417d57b08a71.png

2.配置环境变量

将 mvnd 解码包的执行目录 bin 配置到系统变量 path 中,操作步骤如下图所示:611ccd40db149e654680b866c1a275ec.pngdced5e18e20bfbd7a90fc83174e357cc.png

3.测试 mvnd 安装

接下来打开命令行窗口,使用“mvnd -version”检查一下 mvnd 是否正常安装成功,如下图所示:395a24387530d163aea1286d6c72cb7a.png如果打印了相关的版本信息就说明安装成功了。

mvn VS mvnd 性能测试

接下来就是本文的重头戏了,使用我本地的一个项目来测试一下 mvn 和 mvnd 的性能差距。

我的电脑配置如下:c06d10b9736c929bc8631ea82fde0ab6.png

1.mvn 性能测试

传统的 maven 执行结果如下图所示:23c4ff2ead8416a999557664217ab375.png

打包我本地的一个项目,跳过单元测试。

mvn 性能测试结果:1.312 秒。

2.mvnd 性能测试

e4908a9dfd05e9aac4bf2bdb4d651f1c.png

mvnd 性能测试结果 0.154 秒。

总结

本文介绍了 mvnd,一个内置了 maven 但执行效率远比 maven 快很多的工具。它的上手难度很低,对于用户来说,只是将之前 maven 命令的开头从“mvn”换成了“mvnd”而已。

mvnd 构建了一个或者多个 maven 守护进程,使用了全新的 VM 引擎,并添加了缓存及 JIT 优化,从而大大的提高了 maven 项目的构建速度,也让我们看到了一个能与 Gradle 一较高下的希望,我会持续关注此项目,希望它发展的越来越好。

参考资料:https://github.com/apache/maven-mvnd

43eeceef92f375654f227a4db31ac620.gif

往期推荐

d3c70686b7f3f11a54f2e63486924722.png

Java中List排序的3种方法!


887db6dd25b01ca09ecdbd2c16896645.png

面试官:HashSet是如何保证元素不重复的?


f95897c336f458543ecb62cede35ae27.png

面试官:如何实现 List 集合去重?


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

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

相关文章

java bitset_Java BitSet intersects()方法与示例

java bitsetBitSet类intersects()方法 (BitSet Class intersects() method) intersects() method is available in java.util package. intersects()方法在java.util包中可用。 intersects() method is used to check the common number of bits set to true in both the BitSe…

【C++】For循环同时初始化两个及以上个变量

文章目录0.引言1.初始化同类型变量2.初始化两个不同类型的变量0.引言 \qquadC的for循环在初始化时可以通过类型定义符直接初始化两个相同类型的变量,但是对于不同类型的变量是不可以直接初始化的,若想达到类似python的zip()函数的多类型多变量迭代的效果…

Java 中接口和抽象类竟然有 7 点不同?

作者 | 磊哥来源 | Java面试真题解析(ID:aimianshi666)转载请联系授权(微信ID:GG_Stone)本文已收录《Java常见面试题》系列:https://gitee.com/mydb/interviewJava 是一门面向对象的编程语言&am…

粉丝不在于多,在于够残

李善友:所有可能被互联网取代的组织一定会被取代 2015-07-30 格局视野 格局视野 格局视野 微信号 geju365 功能介绍 格局生涯学院官方自媒体。面向互联网人的在线商学院。推送互联网行业知识,培养互联网实操人才。聚焦新行业、新模式、新公司、新人物。…

优化的交换排序(冒泡排序)_C程序实现优化的冒泡排序

优化的交换排序(冒泡排序)Bubble Sort is a simple, stable, and in-place sorting algorithm. Due to its simplicity, it is widely used as a sorting algorithm by computer programmers. 气泡排序是一种简单,稳定且就地的排序算法。 由于其简单性,它…

保姆级教学:缓存穿透、缓存击穿和缓存雪崩!

前言对于从事后端开发的同学来说,缓存已经变成的项目中必不可少的技术之一。没错,缓存能给我们系统显著的提升性能。但如果你使用不好,或者缺乏相关经验,它也会带来很多意想不到的问题。今天我们一起聊聊如果在项目中引入了缓存&a…

Fast Global Registration (ECCV 2016) 论文解析

目录0.友情链接1. 论文核心思想1.1. 点云特征匹配1.2. 两个校验1.3. 鲁棒函数与BR对偶1.4.1. Black-Rangarjan Duality (BR对偶性)1.4.2.Derivation of Φρ\Phi_\rhoΦρ​1.4.3.E(T,L)E(\bm{T},L)E(T,L)的优化求解方法4.写在后面0.友情链接 FGR基本介绍 CSDN博客…

系统盘压缩卷小于可用空间_操作系统中的可用空间管理

系统盘压缩卷小于可用空间可用空间管理 (Free space management) As we know that the memory space in the disk is limited. So we need to use the space of the deleted files for the allocation of the new file. one optical disk allows only one write at a time in t…

关于头文件是否参与编译的讨论

一、文章来由 写项目的时候发现了这个问题,又是一个比较底层的问题,首先说明,这篇文章只是我根据查阅的资料和做的实验提出的一个讨论,并不一定就是正确答案。因为这个问题网上众说纷纭,我很欢迎大家参与这个讨论&…

Log4j漏洞?一行代码都不改就能永久修复?

△Hollis, 一个对Coding有着独特追求的人△作者 l Hollis来源 l Hollis(ID:hollischuang)这篇文章我周一发过,但是因为一些"人在江湖、身不由己"的原因,原文删除了,但是很多人找我还是想看看内容…

服务器自动抢占GPU运行程序

其原理是通过nvidia-smi扫描每块显卡上的内存,然后查询已经使用的内存,若已经使用的显卡内存不大于一个阈值,则运行python脚本(你也可以替换成别的命令) #!/bin/bash var0 ocp_memory${2:-500} while [ $var -eq 0 ] …

java range类_Java即时类| range()方法与示例

java range类即时类range()方法 (Instant Class range() method) range() method is available in java.time package. range()方法在java.time包中可用。 range() method is used to get the valid range of values for the given TemporalField. range()方法用于获取给定Temp…

ubuntu安装eclipse

2019独角兽企业重金招聘Python工程师标准>>> 在Ubuntu 13.04下的安装eclipse 一、eclipse安装过程 首先确保在安装eclipse之前已经安装好Java虚拟机 1. eclipse官网下载压缩包 下载地址:http://www.eclipse.org/downloads/download.php?file/technology…

java的parse方法_Java即时类| parse()方法与示例

java的parse方法即时类parse()方法 (Instant Class parse() method) parse() method is available in java.time package. parse()方法在java.time包中可用。 parse() method is used to get an Instant that parses the given char sequence and char sequence follow some st…

github果然强大

github果然强大,在idea里写好,可以直接提交到github,在哪台电脑都可以看源码了,手机也可以看 https://github.com/gaojinhua 转载于:https://www.cnblogs.com/gaojinhua/p/4705992.html

Python用sorted实现argsort

\qquadsorted函数会返回一个可迭代对象经过排序后的迭代器,sorted对于number类型的可迭代对象会按照数值大小排序,对于字符串则按照ASCII码顺序排序,但如果要返回排序的index怎么呢? \qquadsorted有一个功能就是根据key参数比较大…

保姆级教程,终于搞懂脏读、幻读和不可重复读了!

作者 | 王磊来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)我的文章合集:https://gitee.com/mydb/interview在 MySQL 中事务的隔离级别有以下 4 种:读未提交&am…

c++中cend end_vector :: cend()函数以及C ++ STL中的示例

c中cend endC vector :: cend()函数 (C vector::cend() function) vector::cend() is a library function of "vector" header, it can be used to get the last element of a vector. It returns a const iterator pointing to the past-the-end element of the ve…

alert提示框样式

http://runjs.cn/detail/pembjylb转载于:https://www.cnblogs.com/bky-234/p/4706103.html

保姆级教程,终于搞懂脏读、幻读和不可重复读了!(经典回顾)

作者 | 王磊来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)我的文章合集:https://gitee.com/mydb/interview在 MySQL 中事务的隔离级别有以下 4 种:读未提交&am…