点击“终码一生”,关注,置顶公众号、

每日技术干货,第一时间送达!

相信作为Java开发者的你早已经受够了maven的编译缓慢,但是又由于历史包袱、使用习惯等问题暂时切换不了其他更快的构建工具,这里笔者将给你介绍一款更快的maven——maven-mvnd

1、介绍

maven-mvnd是Apache Maven团队借鉴了Gradle和Takari后衍生出的更快的构建工具。mvnd内嵌了Maven,也正是因为这个原因我们可以无缝地将Maven切换为mvnd(也不需要单独安装Maven)。

在设计上,在mvnd中会生成一个或多个的守护进程来服务构建请求以此来达到并行构建的效果。另外在VM的选择上,mvnd使用了GraalVM来代替传统的JVM,与之相比GraalVM启动速度更快,占用的内存更少。

根据文档描述,与传统的Maven相比mvnd具有以下优势:

  • 运行构建的JVM不需要为每个构建重新启动。

  • Maven插件类的类加载器缓存在多个构建中,插件jars只会被读取和解析一次。

  • JVM中JIT生成的本机代码会被保留。与Maven相比,JIT编译花费的时间更少。在重复构建期间,JIT优化的代码立即可用。这不仅适用于来自Maven插件和Maven内核的代码,也适用于来自JDK本身的所有代码。

默认情况下,mvnd使用多个CPU内核并行构建模块。使用的内核数由公式Math.max(Runtime.getRuntime().availableProcessors() - 1, 1)给出。如果您的源代码树不支持并行构建,请在命令行上传递-T1以使您的构建串行。

同时官方给出了24核机器上运行的动态图:

2、安装

对于mvnd的安装,官方文档给了十分详细的教程,建议先行阅读:https://github.com/apache/maven-mvnd 。

笔者是通过Homebrew进行安装的,实践证明macOS m1安装使用是没有问题的。不过需要注意的是通过此种方式安装的mvnd版本为0.7.1,而经过在ubuntu和macOS m1上进行测试发现此版本并不支持JDK8(可能仅是笔者电脑问题),而通过官方例子所示的JDK11确是没问题。在JDK8运行mvnd命令会产生以下错误:

~ % mvnd -v
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/mvndaemon/mvnd/client/DefaultClient has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:757)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:473)
at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
at java.lang.ClassLoader.loadClass(ClassLoader.java:419)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
at java.lang.ClassLoader.loadClass(ClassLoader.java:352)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:601)

预估应该是这种方式下载的执行文件是通过高版本的JDK编译的,在低版本上运行因为缺少某些方法或特性所以运行不了。在一筹莫展之际,笔者从maven-mvnd的最新版本的更新说明上发现一个Closed issues:Different java versions for mvnd and maven #512,在该问题上作者提供了一种解决方案就是将JAVA_HOME所指定的版本设置为JDK11,并且在运行mvnd命令时加上参数-Dmaven.compiler.release=8,即

mvnd -Dmaven.compiler.release=8 compile

通过这种方式即能生成出JDK8所对应的编译代码。

对于issue #512中作者回应mvnd的最低支持版本是JDK8,但是笔者从0.5.2开始尝试还是报同样的错...或许是笔者电脑存在一定的问题,因为我看到其他人在贴出的结果图显示JDK8下最新版本也是能够安装并使用的。另外如果还是不行的话也许我们能够通过手动编译源码来生成可执行文件,具体步骤在官方readme上已经给出相应的步骤。

3、使用

在使用上与Maven的用法是完全相同的,只需将命令mvn改为mvnd即可。而在笔者本机的实测中,与传统的Maven相比,通过mvnd的构建所耗费的时间是原来的1/2。

4、总结

本文笔者分别从maven-mvnd的介绍、安装、使用及其出现的一些异常情况展开陈述,如果读者想知道更多细节可阅读官方文档。而也许强化后的Maven依然比不过Gradle,但是在历史包袱、使用习惯等背景下Maven的这次强化还是很香的。

参考:

https://github.com/apache/maven-mvnd

https://github.com/apache/maven-mvnd/issues/512

https://mp.weixin.qq.com/s/TG_6vq0mgbej8F3Qvpb6Vw

PS:防止找不到本篇文章,可以收藏点赞,方便翻阅查找哦

更快 Maven 来袭,性能大幅提升相关推荐

  1. 更快 Maven 来袭,性能大幅提升!

    相信作为Java开发者的你早已经受够了maven的编译缓慢,但是又由于历史包袱.使用习惯等问题暂时切换不了其他更快的构建工具,这里笔者将给你介绍一款更快的maven--maven-mvnd. 1 介绍 ...

  2. .NET Core 2.1 Preview 1发布:更快的构建性能

    今天,我们宣布发布 .NET Core 2.1 Preview 1.这是 .NET Core 2.1 的第一个公开发布.我们有很大的改进希望分享出来,并且渴望得到您的反馈意见,无论是在评论中还是在gi ...

  3. 让oracle跑得更快——oracle 10g性能分析与优化思路,[让Oracle跑得更快.Oracle.10g性能分析与优化思路]概要1.doc...

    [让Oracle跑得更快.Oracle.10g性能分析与优化思路]概要1 在线事务(OLTP) 在线分析(OLAP) 在Oracle数据库中,凡是分配了存储空间的,都称为段,所有段并不一定指的是表,也 ...

  4. oracle 10g 速度慢,让Oracle跑得更快—Oracle 10g性能分析与优化思路_数据库教程

    资源名称:让Oracle跑得更快-Oracle 10g性能分析与优化思路 内容简介: 在这本书里读者将会学到作者在性能优化方面的一些思路和思考,一些故障处理的方法和原则,这些东西是作者在实践中长期积累 ...

  5. TensorRT 3:更快的TensorFlow推理和Volta支持

    TensorRT 3:更快的TensorFlow推理和Volta支持 TensorRT 3: Faster TensorFlow Inference and Volta Support 英伟达Tens ...

  6. 更快更强,谷歌提出SWideRNet:全景分割新标杆来啦!

    作者丨Happy 编辑丨极市平台 导读 本文是DeepLab系列作者"Liang-Chieh Chen"大神在全景分割领域的又一力作.它在Wide-ResNet的基础上引入SE与& ...

  7. 博文视点大讲堂36期——让Oracle跑得更快 成功举办

    博文视点大讲堂36期--让Oracle跑得更快 成功举办 电子工业出版社博文视点公司于2010年9月日在西单图书大厦成功举办"博文视点大讲堂36期--让Oracle跑得更快"讲座. ...

  8. append是什么意思java_为什么StringBuilder#append(int)在Java 7中比在Java 8中更快?

    在调查 little debate w.r.t.使用""和 Integer.toString(int)将整数原语转换为字符串我写了这个 JMH microbenchmark: @F ...

  9. 更快的Maven构建工具mvnd和Gradle哪个性能更好?

    作者 | 磊哥 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) Maven 作为经典的项目构建工具相信很多人已经用很久了,但如果体验过 Gradl ...

最新文章

  1. 寻找最大的K个数(上)
  2. Bullmind-在线UML软件工具箱
  3. php生成格式 word文档,php使用phpword生成word文档
  4. 英语笔记:写作:Limiting the use of disposable plastic bags
  5. java生成xml_在JAVA生成XML文件
  6. 头像上传html js版,javascript头像上传代码实例
  7. 洛谷1056 排座椅 解题报告
  8. mysql主从复制中间件_linux下mysql主从复制(第二篇读写分离) mycat 中间件
  9. jquery粘贴按钮_实现前端点击按钮自动复制剪贴板功能
  10. iphone转android通讯录,苹果IPHONE通讯录电话簿转到安卓手机csv,vcf方法(ITUNES,OUTLOOK,EXCEL)...
  11. Vista系统Administrator帐户的激活与禁用
  12. excel数据分组存到一个excel的多个sheet中
  13. Linux平台基于v4l2开发免驱摄像头-输出为Opencv Mat
  14. html2pdf无法导出图片解决方案(2020版)
  15. 牛客练习赛53 E.老瞎眼 pk 小鲜肉(离线+BIT单点修改)
  16. Deep Mind 团队论文Playing Atari with Deep Reinforcement Learning复现
  17. httpqyl.php,linux运维架构--PHP开发-零基础学习PHP视频教程
  18. 福昕阅读器无法注释的解决
  19. #18 可视化基础4-簇形柱状图、百分比堆积柱状图、并列子图
  20. 连上校园网可以上网但是显示无internet不能开热点或者热点可以打开但无ip分配(电脑诊断简单,时间久一些涉及到重启电脑)

热门文章

  1. 华东师大计算机专业考研难度,华东师范大学考研有多难?
  2. FSK/OOK 调制单发射芯片CMT2119A-ESR/CMT2119B-EQR
  3. 股票入门技巧-----股票开户
  4. overflow的属性介绍
  5. java对接支付宝实现支付功能
  6. 服务注册中心Eureka
  7. Imx8串口故障案例分析
  8. 高并发场景下对热点数据的处理
  9. 风车签名管理 for Mac版 - 让签名后的APP可以完全管控和实时监测
  10. 小猿圈python学习-面向对象语法