前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Maven官宣:干掉Maven和Gradle!推出更强更快更牛逼的新一代构建工具,炸裂!

Maven官宣:干掉Maven和Gradle!推出更强更快更牛逼的新一代构建工具,炸裂!

作者头像
芋道源码
发布2022-03-04 11:12:52
2480
发布2022-03-04 11:12:52
举报
文章被收录于专栏:芋道源码1024芋道源码1024

点击上方“芋道源码”,选择“设为星标

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

来源:网络


相信作为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核机器上运行的动态图:

“推荐下自己做的 Spring Boot 的实战项目: https://github.com/YunaiV/ruoyi-vue-pro

二.安装

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

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

代码语言:javascript
复制
~ % 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)

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

代码语言:javascript
复制
mvnd -Dmaven.compiler.release=8 compile

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

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

“推荐下自己做的 Spring Cloud 的实战项目: https://github.com/YunaiV/onemall

三.使用

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

四.总结

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



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

已在知识星球更新源码解析如下:

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

代码语言:javascript
复制
文章有帮助的话,在看,转发吧。谢谢支持哟 (*^__^*)
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-01-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 芋道源码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.介绍
  • 二.安装
  • 三.使用
  • 四.总结
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档