Maven经常被拿来和Gradle做对比,最大的劣势之一就是Maven构建慢,GradleMaven构建速度快2到10倍,而如今Maven也可以更快了。Apache Maven团队从GradleTakari(Maven生命周期优化器)中获得灵感对Maven进行了强化,衍生出maven-mvnd项目,今天胖哥带你来尝尝鲜。

简单介绍

mvnd并不是对Maven进行了重构,而是内置了Maven。它实际上是一个或者多个Maven守护进程,用来执行实际的构建服务。一个守护进程实例可以为来自mvnd客户端的多个连续请求提供Maven构建服务。当没有空闲的守护进程时来支撑构建请求时,mvnd可以并行生成多个守护程序。

使用GraalVM代替JVM

mvnd之所以快是因为它使用了GraalVM替代了传统的JVM,因此它启动更快,占用内存更少,而且在实行构建时不需要为每个构建启动新的JVM。另外Maven插件在构建时不再需要多次加载,而是缓存在多个构建中。SNAPSHOT版本的Maven插件不会被缓存。

支持JIT

GraalVMJIT(Just In Time)实时编译特性也被运用到Maven构建作业中。JIT可以大大降低编译时间,在重复构建过程中,JIT优化代码立即可用,也极大提高了构建效率。

并行构建

目前Maven 3的并行构建(parallel builds)还是实验特性,而且要求使用的插件必须是线程安全的。而mvnd默认就支持使用多个CPU内核进行并行构建。当然如果你的源代码不支持并行构建,也可以通过添加- T1 参数切换到串行构建。

简单尝试

接下来简单尝试一下mvnd

安装

目前mvnd已经支持LinuxMacOSWindows平台。你可以分别通过SDKMANHomebrewChocolatey这些包管理器进行安装。也可以直接去mvnd发行版仓库下载对应的二进制进行安装。这里以Windows为例,我选择Chocolatey安装:

choco install mvndaemon

时间可能比较长一些。

配置

配置很简单,只需要注意两点

  • 如果不使用包管理器进行安装的话请确保mvndbin目录关联到PATH
  • 如果没有配置或者不想配置JAVA_HOME环境变量的话请在~/.m2/mvnd.properties中设置java.home以指定Java目录,例如:java.home=C:\\AdoptOpenJDK\\jdk-8。已经配置环境变量的请忽略该条。

其它的配置项可参考mvnd配置

使用

安装配置完毕后命令行执行mvnd --version出现下列结果就表示安装成功了。

mvnd --version
mvnd native client 0.7.1-windows-amd64 (97c587c11383a67b5bd0ff8388bd94c694b91c1e)
Terminal: org.jline.terminal.impl.jansi.win.JansiWinSysTerminal
Apache Maven 3.8.3 (ff8e977a158738155dc465c6a97ffaf31982d739)
Maven home: C:\Program Files\mvndaemon\mvnd-0.7.1-windows-amd64\mvn
Java version: 1.8.0_282, vendor: AdoptOpenJDK, runtime: C:\Program Files\AdoptOpenJDK\jdk-8.0.282.8-hotspot\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"

为了降低学习成本mvnd的方式和传统Maven类似,mvn变成了mvnd,你也可以通过mvnd --help来查看完整的命令选项清单。

说实话并行构建就是快,简直坐火箭一般。另外,控制台输出也优化了。

由于GraalVM的加持,这个工具很可能会延长Maven的生命,避免过早被Gradle拉开优势。对于我们来说,这个项目可以观望一下,看看Apache Maven官方的进一步动作。

关注公众号:Felordcn 获取更多资讯

个人博客:https://felord.cn

更快的Maven来了的更多相关文章

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

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

  2. 更快的Maven构建工具mvnd和Gradle哪个更快?

    Maven 作为经典的项目构建工具相信很多人已经用很久了,但如果体验过 Gradle,那感觉只有两个字"真香". 前段时间测评了更快的 Maven 构建工具 mvnd,感觉性能挺高 ...

  3. 不妨试试更快更小更灵活Java开发框架Solon

    @ 目录 概述 定义 性能 架构 实战 Solon Web示例 Solon Mybatis-Plus示例 Solon WebSocket示例 Solon Remoting RPC示例 Solon Cl ...

  4. 精通Web Analytics 2.0 (9) 第七章:失败更快:爆发测试与实验的能量

    精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第七章:失败更快:爆发测试与实验的能量 欢迎来到实验和测试这个棒极了的世界! 如果Web拥有一个超越所有其他渠道的巨大优势,它就 ...

  5. 假如 UNION ALL 里面的子句 有 JOIN ,那个执行更快呢

    比如: select id, name from table1 where name = 'x' union all select id, name from table2 where name =  ...

  6. 【译】更快的方式实现PHP数组去重

    原文:Faster Alternative to PHP’s Array Unique Function 概述 使用PHP的array_unique()函数允许你传递一个数组,然后移除重复的值,返回一 ...

  7. ubuntu 12.04 LTS 如何使用更快的更新源

    装好ubuntu系统后的第一见事就是替换自带的更新源,原因是系统自带的源有些在中国访问不了,可以访问的速度又特别慢.幸好国内的一些公司和大学提供了速度不错的更新源.下面介绍如何使用更快的更新源 方法/ ...

  8. php提供更快的文件下载

    在微博上偶然看到一篇介绍php更快下载文件的方法,其实就是利用web服务器的xsendfile特性,鸟哥的博客中只说了apache的实现方式,我找到了介绍nginx实现方式的文章,整理一下! let' ...

  9. CSS 和 JS 动画哪个更快

    基于Javascript的动画暗中同CSS过渡效果一样,甚至更加快,这怎么可能呢?而Adobe和Google持续发布的富媒体移动网站的性能可媲美本地应用,这又怎么可能呢? 本文逐一遍览了基于Javas ...

随机推荐

  1. bcftools 提取vcf(snp/indel)文件子集

    做群体变异检测后,通常会有提取子集的操作,之前没有发现bcftools有这个功能,都是自己写脚本操作,数据量一上来,速度真的是让人无语凝噎.这里记录下提取子vcf文件的用法,软件版本:bcftools ...

  2. R语言与医学统计图形-【27】ggplot2图形组合、字体、保存

    ggplot2绘图系统--图形组合.字体选择.保存输出 1.图形组合 一页多图在基础包中利用par和layout函数来切分画布. ggplot2是先铺好网格背景,再进行绘图,所以要通过切分网格背景来实 ...

  3. nginx_日志切割脚本

    #!/bin/bash NGINX_LOG=/usr/loca/nginx/logs/access.log RE_LOG=/data/backup/`data +%Y%m%d` echo -e &qu ...

  4. Excel-实现选择性粘贴(粘贴公式为文本)自动化,不想手动

    10.选择性粘贴(粘贴公式为文本)自动化,不想手动: (1)参考:https://jingyan.baidu.com/article/20b68a88a8bf55796cec62a3.html (2) ...

  5. MongoDB的搭建、参数

    Mongodb官网:https://www.mongodb.com/ mkdir -r  /data/db touch  /data/log tar -zxvf mongodb-linux-x86_6 ...

  6. JAVA中数组的基本概念与用法

    JAVA中数组的基本概念与用法 1. 数组的定义与特点 数组的一种引用数据类型 数组中可以同时存放多个数据,但是数据的类型必须统一 数组的长度在开始时就需要确定,在程序运行期间是不可改变的 虽然可以使 ...

  7. db9串口接头的定义

    这个接头都是以公头为准,所有接头还是以公头去记. RS-232端(DB9公头/针型)引脚定义 2: RXD 3:TXD 5:GND 1/4/6:内部相链接 7/8   :内部相链接 1.RS-232端 ...

  8. 视图View,获取视图大小

    一.获得LayoutInflater实例: LayoutInflater layoutInflater=LayoutInflater.from(context); 得到LayoutInflater实例 ...

  9. Advanced C++ | Virtual Constructor

    Can we make a class constructor virtual in C++ to create polymorphic objects? No. C++ being static t ...

  10. OSGI 生命周期

    1 生命周期管理 对于非模块化应用,生命周期将应用作为一个整体来操作: 而对于模块化应用,则可以以细粒度的方式来管理应用的某一个独立部分. OSGi生命周期管理 OSGi生命周期层有两种不同的作用: ...