Maven 学习 之 mvnd 工具详解

文章目录

    • [一、Maven 与 Gradle 编译打包速度分析](#一、Maven 与 Gradle 编译打包速度分析)
      • [1. JVM 启动开销](#1. JVM 启动开销)
      • [2. 依赖管理机制](#2. 依赖管理机制)
      • [3. 插件配置与并行能力](#3. 插件配置与并行能力)
      • [4. 资源消耗](#4. 资源消耗)
    • [二、Maven-mvnd 性能提升原理](#二、Maven-mvnd 性能提升原理)
      • [1. 长期运行的守护进程](#1. 长期运行的守护进程)
      • [2. GraalVM 本地可执行文件](#2. GraalVM 本地可执行文件)
      • [3. 并行处理能力](#3. 并行处理能力)
      • [4. JIT 编译优化](#4. JIT 编译优化)
    • [三、Maven-mvnd 使用指南](#三、Maven-mvnd 使用指南)
      • [1. 下载与安装](#1. 下载与安装)
      • [2. 配置文件](#2. 配置文件)
      • [3. IDEA 集成](#3. IDEA 集成)
      • [4. 本地部署](#4. 本地部署)
    • 四、总结

一、Maven 与 Gradle 编译打包速度分析

Maven 编译打包速度相对 Gradle 编译打包速度慢很多

1. JVM 启动开销

  • 传统 Maven:每次构建时需重新启动 JVM,加载大量类并初始化环境,尤其在大型或多模块项目中耗时显著。
  • Gradle:通过守护进程(Daemon)避免重复启动 JVM,减少初始化时间。

2. 依赖管理机制

  • Maven:依赖解析和下载可能因网络问题或缓存损坏导致延迟,且默认按顺序构建模块,未充分利用多核 CPU。
  • Gradle:支持并行构建和增量编译,依赖管理更高效,且缓存机制更智能。

3. 插件配置与并行能力

  • Maven:部分插件配置不合理或不支持并行执行,导致构建效率低下。
  • Gradle:插件生态更成熟,默认支持并行任务执行。

4. 资源消耗

  • Maven:每次构建均需消耗 CPU 和内存资源,频繁构建时资源浪费明显。
  • Gradle:通过守护进程复用资源,降低资源消耗。

二、Maven-mvnd 性能提升原理

mvnd github 地址

1. 长期运行的守护进程

  • 避免 JVM 重复启动:mvnd 通过守护进程(Daemon)维护长期运行的 JVM 实例,减少每次构建的初始化时间。
  • 多模块项目优化:守护进程可被多个构建请求共享,显著减少多模块项目的前置时间。

2. GraalVM 本地可执行文件

  • 启动更快:mvnd 使用 GraalVM 构建的本地可执行文件,启动速度较传统 JVM 更快。
  • 内存占用更少:相比传统 JVM,mvnd 启动时内存占用更低,适合资源受限环境。

3. 并行处理能力

  • 自动分配线程 :mvnd 默认使用多个 CPU 核心并行构建模块,线程数由公式 Math.max(Runtime.getRuntime().availableProcessors() - 1, 1) 决定。
  • 测试并行化:支持插件(如 Surefire)在模块内并行执行测试,进一步提升速度。

4. JIT 编译优化

  • 代码复用:守护进程中的 JVM 保留实时(JIT)编译器生成的本机代码,重复构建时可直接使用优化后的代码。

三、Maven-mvnd 使用指南

1. 下载与安装

  • 下载地址Maven-mvnd GitHub Releases
  • 安装步骤
    1. 解压下载的压缩包到指定目录。
    2. 配置环境变量:
      • JAVA_HOME:指向 JDK 安装路径(推荐使用 GraalVM)。
      • MVND_HOME:指向 mvnd 解压目录。
      • %MVND_HOME%\bin 添加到 PATH
  • 验证安装 :运行 mvnd -v,确认版本信息。

2. 配置文件

  • mvnd.properties

    • 可自定义 Java 版本、守护进程超时时间等参数。

    • 示例配置:

      properties 复制代码
      java.home=/path/to/custom/java/home
      daemon.idle.timeout=120 minutes
  • settings.xml

    • 可复用原有 Maven 的 settings.xml 文件,无需额外修改。

3. IDEA 集成

  • 配置 Maven 路径
    1. 打开 IDEA,进入 File > Settings > Build, Execution, Deployment > Build Tools > Maven
    2. 设置 Maven home path 为 mvnd 的安装目录。
    3. 设置 User settings fileLocal repository 为原有 Maven 配置。
  • 使用 mvnd 命令
    • 在 IDEA 的 Maven 工具窗口中,右键任务选择 Run with mvnd
    • 或在终端中直接运行 mvnd clean package 等命令。

4. 本地部署

  • 配置 pom.xml

    • 使用 maven-resources-plugin 将构建文件复制到本地目录:

      xml 复制代码
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>3.2.0</version>
            <executions>
              <execution>
                <id>copy-resources</id>
                <phase>install</phase>
                <goals>
                  <goal>copy-resources</goal>
                </goals>
                <configuration>
                  <outputDirectory>/path/to/local/directory</outputDirectory>
                  <resources>
                    <resource>
                      <directory>${project.build.directory}</directory>
                      <includes>
                        <include>*.jar</include>
                      </includes>
                    </resource>
                  </resources>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
  • 执行部署

    • 运行 mvnd clean install,构建完成后文件将自动复制到指定目录。

四、总结

  • Maven-mvnd 通过守护进程、GraalVM 本地可执行文件和并行处理能力,显著提升了 Maven 的构建速度,尤其适合多模块项目和频繁构建场景。
  • 使用步骤:下载安装、配置环境变量、集成 IDEA、配置本地部署,即可无缝迁移并享受性能提升。
  • 适用场景:对于希望保留 Maven 生态但追求更高构建效率的团队,mvnd 是一个低风险、高收益的选择。
相关推荐
菠萝催学1235 小时前
日志配置Slf4j
java·数据库·spring·tomcat·maven·intellij-idea
ahauedu6 小时前
Apache POI 依赖版本冲突导致 NoSuchFieldError: Factory 报错
java·maven·apache
Lil Jan1 天前
03-Web后端基础(Maven基础)
java·前端·maven
工作log2 天前
自己动手造轮子:如何创建JAR并通过Maven在Spring Boot中引用
spring boot·maven·jar
kokouya3 天前
macOS配置maven及报错处理:zsh: permission denied: mvn
maven
南洋十三郎3 天前
JavaWeb学习打卡05(在IDEA中创建并使用MavenWeb项目详解、POM.XML文件)
学习·maven·intellij-idea
橘子编程3 天前
Docker详解及实战
java·开发语言·mysql·spring·docker·maven
wsj__WSJ3 天前
IntelliJ IDEA (2024.3.1)优雅导入 Maven 项目的两种方式详解
java·maven·intellij-idea
jacGJ3 天前
记录解决问题--使用maven help插件一次性上传所有依赖到离线环境,spring-boot-starter-undertow离线环境缺少依赖
java·数据库·maven
一叶知秋963 天前
idea部署新项目时,用自定义的maven出现的问题解决
java·maven·intellij-idea