新一代Java高性能构建工具Maven-mvnd【实践可行版】
Maven-mvnd(通常简称mvnd)主要解决了Maven构建过程中的以下痛点需求:
- 构建速度慢: Maven构建过程中的一个主要瓶颈是在每个构建周期开始时JVM的初始化。JVM的启动需要加载大量的类和初始化环境,这在大型项目或多模块项目中尤其耗时。mvnd通过维护一个长期运行的Maven守护进程(Daemon),避免了每次构建时JVM的重复启动,显著提高了构建速度。
- 资源消耗高: 每次构建都需要消耗系统资源,如CPU和内存,用于JVM的启动和运行。mvnd的守护进程能够在构建之间保持活跃,减少了资源的浪费,特别是在持续集成/持续部署(CI/CD)环境中,频繁的构建会更加受益于此优化。
- 频繁构建的延迟: 在现代开发实践中,快速反馈循环是非常重要的。然而,传统的Maven构建可能会导致开发人员在修改代码后等待较长的时间才能看到构建结果。mvnd通过加速构建过程,缩短了等待时间,提高了开发效率。
- 多项目构建优化: 对于拥有多个Maven项目的组织,mvnd可以显著减少构建整个项目集所需的时间。守护进程可以被多个构建请求共享,从而减少了每个项目构建的前置时间。
- 易于迁移和使用: mvnd在使用上与传统Maven非常相似,这意味着开发人员无需学习新的构建工具语法或调整现有的Maven POM文件。这种无缝迁移的能力使得mvnd成为了一个低风险的选择,特别是对于那些希望改进构建性能但又不想放弃Maven生态系统的团队。
通过解决上述痛点,Maven-mvnd旨在提供一个更高效、更快速的构建体验,同时保持与现有Maven工作流的兼容性,从而为开发团队带来更高的生产力和更快的迭代速度。
Maven-mvnd介绍
Maven 的优点是稳定可靠,在绝大多数的项目上工作良好,社区生态很完善,几乎所有的 Java 开发者都在用。Maven 的缺点是,对于大一点的项目来说,构建太慢了。有时候只能在服务器端完成构建 ,心酸呀。
Gradle 的优点是足够的灵活,构建速度也会更快一点,因为使用了后台进程和缓存机制。Gradle 的缺点是版本迭代速度太快,社区跟不上,对于初学者来说,还是有一定的学习曲线。
所有是否有一种能快速构建Java项目的工具时,今天重点推荐maven-mvnd,是Apache Maven团队借鉴了Gradle和Takari的优点,衍生出来的更快的构建工具,maven的强化版,解决Maven构建慢的问题,又不需要重新学习,懂Maven你就能驾驭Maven-mvnd。
maven-mvnd 特性:
- 嵌入 Maven (所以不需要单独安装 Maven);maven 过渡到 maven-mvnd的过程中实现 无缝切换!所以不需要再安装maven或进行复杂的配置更改。
- 实际的构建发生在一个长期存在的后台进程中,也就是守护进程。如果没有为构建请求服务的空闲守护进程,则可以并行产生多个守护进程。
- 一个守护进程实例可以处理来自 mvnd 客户机的多个连续请求。
- 使用 GraalVM 构建的本地可执行文件。与传统的 JVM 相比,它启动更快,使用的内存更少。
这种架构带来的优势有:
- 运行实际构建的 JVM 不需要为每个构建重新启动,节省时间。
- JVM 中的实时(JIT)编译器生成的本机代码也保留了下来。与 Maven 相比,JIT 编译花费的时间更少。在重复构建过程中,JIT 优化的代码可以立即使用。这不仅适用于来自 Maven 插件和 Maven Core 的代码,也适用于来自 JDK 本身的所有代码。
使用步骤
下载
安装
直接解压。然后配置环境变量:
- JAVA_HOME
- MAVEN_HOME
- MAVEN_MVND_HOME
将 bin 目录添加到 PATH,注意前提条件JAVA_HOME是存在,如果没有配置JAVA_HOME
测试
mvnd -v
使用
在使用上和Maven一样,参数也一致。
Maven 使用 mvn clean package
; 使用Maven-mvnd 只需要变成 mvnd clean package
即可,其他同理。
配置修改
为了最小程度的兼容原来的Maven,可以使用原来的 setting.xml
打开 Maven-mvnd 安装目录下 的 /conf/mvnd.properties
文件,在文件最后一行,修改如下:
如果没有配置JAVA_HOME也可以指定Java JDK路径:
maven.settings=F:/javaee/apache-maven-3.6.3/conf/settings.xml
打包对比
# maven 打包命令
mvn clean package '-Dmaven.test.skip=true'
# mvnd 打包命令
mvnd clean package '-Dmaven.test.skip=true'
如果子项目越多,相对速度更快的趋势。总的来说,如果项目模块很多,可以尝试使用 mvnd 进行辅助打包,比如 测试、生产,可以节省很多时间。
最后,如果你要追求高打包效率,使用Gradle也是一种解决方案,可以尝试。最后在项目中推行一种或混合的模式。
转载自:https://juejin.cn/post/7394073179483947008