maven-mvnd,新一代构建工具

本文介绍了Apache Maven团队推出的maven-mvnd,一个比传统Maven更快的构建工具。mvnd利用守护进程和GraalVM实现快速启动和内存优化,提高构建效率。在遇到JDK8兼容性问题时,可以通过设置JAVA_HOME和编译参数解决。实际测试中,mvnd的构建速度约为Maven的一半。文章还分享了安装、使用方法及异常处理,适合希望提升Maven构建速度的开发者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

相信作为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命令会产生以下错误:

~ % 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,即

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的这次强化还是很香的。

 

### 如何在 UniApp 中开发微信小程序的自定义菜单栏 #### 背景说明 UniApp 是一个多端框架,支持一次编写代码并部署到多个平台(如微信小程序、H5 和 App)。通过 UniApp 开发微信小程序时,可以利用其丰富的模板和功能来实现复杂的界面设计,比如自定义菜单栏。 为了实现在 UniApp 中开发微信小程序的自定义菜单栏,以下是详细的解决方案: --- #### 实现步骤概述 1. **配置 `pages.json` 文件** 需要在项目的 `pages.json` 文件中启用自定义导航栏的功能。具体来说,需要设置 `"navigationStyle": "custom"` 属性[^1]。 2. **HTML 结构** 使用 Vue 的组件化结构,在页面顶部放置一个自定义菜单栏容器,并绑定事件处理逻辑。 3. **样式调整** 利用 CSS 对菜单项进行布局和美化,确保适配不同屏幕尺寸。 4. **交互逻辑** 编写 JavaScript 或 TypeScript 代码,用于响应用户的点击行为,并触发相应的业务逻辑。 --- #### 示例代码 ##### 1. 修改 `pages.json` ```json { "globalStyle": { "navigationBarTitleText": "自定义菜单栏", "navigationStyle": "custom" }, "pages": [ { "path": "pages/index/index", "style": { "navigationStyle": "custom" } } ] } ``` ##### 2. 页面 HTML (Vue 组件) ```vue <template> <view class="menu-bar"> <view class="menu-item" @click="handleItemClick('home')">首页</view> <view class="menu-item" @click="handleItemClick('profile')">个人中心</view> <view class="menu-item" @click="handleItemClick('settings')">设置</view> </view> </template> <script> export default { methods: { handleItemClick(pageName) { console.log(`跳转至 ${pageName}`); switch (pageName) { case 'home': this.$router.push('/pages/home/home'); break; case 'profile': this.$router.push('/pages/profile/profile'); break; case 'settings': this.$router.push('/pages/settings/settings'); break; default: console.error('未知页面:', pageName); } } } }; </script> <style scoped> .menu-bar { display: flex; justify-content: space-around; align-items: center; height: 80px; background-color: #f7f7f7; border-bottom: 1px solid #eaeaea; } .menu-item { font-size: 16px; color: #333; padding: 8px 16px; cursor: pointer; } .menu-item:hover { background-color: #ddd; } </style> ``` --- #### 关键点解析 - **自定义导航栏** 在微信小程序中,默认提供了一个固定的导航栏,但如果希望完全控制导航栏的内容和样式,则可以通过设置 `"navigationStyle": "custom"` 来隐藏默认导航栏,并自行绘制替代方案。 - **路由管理** 上述示例中使用了 `$router.push()` 方法来进行页面跳转。这是基于 Vue Router 的机制,适用于 UniApp 项目中的多页应用开发场景。 - **跨端兼容性** 如果计划将此功能扩展到其他平台(如 H5 或 App),需要注意某些样式可能因设备差异而表现不一致。因此建议测试多种环境下的显示效果[^2]。 --- #### 注意事项 - 确保已安装最新版本的 HBuilderX 工具,以便获得最佳的开发体验和支持。 - 测试过程中需关注性能优化问题,尤其是当菜单栏包含大量动态数据或复杂动画时。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值