更快 Maven 来袭,性能大幅提高

2022年01月15日 阅读数:4
这篇文章主要向大家介绍更快 Maven 来袭,性能大幅提高,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

点击“终码一辈子”,关注,置顶公众号java

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



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



一、介绍


maven-mvnd是Apache Maven团队借鉴了Gradle和Takari后衍生出的更快的构建工具。mvnd内嵌了Maven,也正是由于这个缘由咱们能够无缝地将Maven切换为mvnd(也不须要单独安装Maven)。github


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


根据文档描述,与传统的Maven相比mvnd具备如下优点:ubuntu


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


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


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


更快 Maven 来袭,性能大幅提高_maven



二、安装


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


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


~ % 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上已经给出相应的步骤。



三、使用


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



四、总结


本文笔者分别从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:防止找不到本篇文章,能够收藏点赞,方便翻阅查找哦