来源:程序员小乐
版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢!
往期惊喜:
扫码关注我们的Java架构师技术
带你全面深入Java
大家好,我是Java架构师
相信作为Java开发者的你早已经受够了maven的编译缓慢,但是又由于历史包袱、使用习惯等问题暂时切换不了其他更快的构建工具,这里笔者将给你介绍一款更快的maven——maven-mvnd。
一.介绍
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核机器上运行的动态图:
对于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)
mvnd -Dmaven.compiler.release=8 compile
通过这种方式即能生成出JDK8所对应的编译代码。另外,搜索公众号顶级架构师后台回复“offer”,获取一份惊喜礼包。
在使用上与Maven的用法是完全相同的,只需将命令mvn改为mvnd即可。而在笔者本机的实测中,与传统的Maven相比,通过mvnd的构建所耗费的时间是原来的1/2。
参考:
https://github.com/apache/maven-mvnd
https://github.com/apache/maven-mvnd/issues/512
https://mp.weixin.qq.com/s/TG_6vq0mgbej8F3Qvpb6Vw
最后,整理了100多套项目,赠送读者。扫码下方二维码,后台回复【赚钱】即可获取。
--END--