1. 概述

本文将介绍多种加速Maven构建的实用技巧。我们将探讨不同优化方案及其优缺点,帮助你根据实际场景选择合适策略。

2. 通用建议

在尝试任何优化前,先记住这个关键点:选择正确的Maven阶段能节省大量时间。比如只需要编译代码时,为什么要运行完整的install阶段污染本地仓库呢?

对于多模块项目,可以只重建变更模块及其依赖模块。假设只修改了module1module2

$ mvn clean install -pl module1,module2 -am

3. 多线程构建

默认情况下Maven使用单线程顺序构建。但现代计算机都有多核CPU,利用-T选项启用并行构建

$ mvn clean install -T 1C
  • -T 1C 表示每个CPU核心分配一个线程
  • -T 4 则强制使用4个线程

⚠️ Maven Reactor会自动处理模块依赖关系,确保依赖模块按顺序执行。

4. 测试优化

测试虽重要,但执行耗时较长。以下是几种优化方案:

4.1 并行执行测试

默认Surefire插件顺序执行单元测试。通过以下参数启用并行测试

mvn clean install -Dparallel=all -DperCoreThreadCount=true

❌ 注意:当单元测试数量较少时,并行初始化的开销可能抵消加速效果。

4.2 跳过测试执行

本地开发时可用-DskipTests跳过测试执行(仍会编译测试代码):

$ mvn clean install -DskipTests

✅ 在测试密集型项目中,此方法能显著节省时间。

4.3 跳过测试编译

使用-Dmaven.test.skip=true可同时跳过测试编译和执行:

$ mvn clean install -Dmaven.test.skip=true

此方案能进一步缩短构建时间。

5. JVM参数优化

默认HotSpot JVM使用分层编译(同时使用客户端和服务端编译器),这对长期运行的服务器进程更有效。但构建过程是短期进程,建议在.mvn/jvm.config文件中配置:

-XX:-TieredCompilation -XX:TieredStopAtLevel=1
  • -XX:-TieredCompilation:禁用分层编译
  • -XX:TieredStopAtLevel=1:仅使用客户端编译器

⚠️ 此优化在需要编译大量新代码时效果更明显。

6. 离线模式

构建过程中Maven会多次访问远程仓库(解析依赖、下载插件等),尤其每次都会检查快照版本更新。使用-o启用离线模式:

$ mvn clean install -o

❌ 需要更新依赖时不能使用此模式。

7. 性能瓶颈分析

当上述方法效果不足时,可用Maven Profiler定位瓶颈。安装步骤:

  1. 创建新Maven项目
  2. 按GitHub项目说明安装Maven Profiler
  3. pom.xml添加插件:
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-profiler-plugin</artifactId>
            <version>1.7</version>
        </plugin>
    </plugins>
</build>

执行带-Dprofile的构建:

$ mvn clean install -Dprofile

构建完成后,在.profiler目录查看HTML报告:

Maven Profiler Results

报告会列出:

  • 所有插件执行耗时
  • 下载的依赖信息

这有助于识别耗时且价值低的插件。

8. 使用Maven Profile

定位瓶颈后,通过Maven Profile按需跳过耗时任务。例如集成测试通常耗时且本地环境无需频繁执行:

  1. 添加Failsafe插件配置:
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>3.1.2</version>
    <executions>
        <execution>
            <goals>
                <goal>integration-test</goal>
                <goal>verify</goal>
            </goals>
        </execution>
    </executions>
</plugin>
  1. 创建跳过Profile:
<profiles>
    <profile>
        <id>skipITs</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-failsafe-plugin</artifactId>
                    <configuration>
                        <skip>true</skip>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

激活Profile跳过集成测试:

$ mvn clean install -PskipITs

9. 使用Maven Daemon

Maven Daemon(mvnd)通过后台进程提升构建速度。它将核心组件常驻内存,避免重复启动开销。安装步骤参考GitHub文档,使用方式:

$ mvnd clean install

首次启动会稍慢,后续构建显著加速。可与其他技巧组合使用:

$ mvnd clean install -Dmaven.test.skip=true

⚠️ 由于Daemon是长期进程,前述JVM参数优化可能适得其反。

9.1 状态查询

--status查看运行中的Daemon:

$ mvnd --status

输出示例:

  ID      PID          Address          Status  RSS       Last Activity           Java Home     
a0d06517  42987  inet:/127.0.0.1:57923   Idle   483m  2024-09-27T23:46:18.969  /opt/openjdk/Home

包含进程ID、地址、状态、内存占用、最后活动时间等信息。

9.2 停止Daemon

--stop终止所有Daemon:

$ mvnd --stop

输出示例:

Stopping 1 running daemons

10. 总结

本文介绍了多种Maven加速方案,核心建议:

  1. 优先使用Maven Daemon
  2. 按需跳过测试
  3. 通过性能分析定位瓶颈
  4. 使用Profile排除低价值任务

若仍需进一步优化,可尝试文中其他技巧。根据项目特点组合使用这些方法,能显著提升开发效率。


原始标题:How to Speed Up Maven Build | Baeldung