如何加速Maven构建速度?


混合几种加速技术的命令:

mvnd test -Dparallel=all -DperCoreThreadCount=false -DthreadCount=16 -o

使用技术有:
  • mvnd命令,使用的是 Maven 守护进程
  • 并行运行测试
  • 不更新SNAPSHOT依赖
  • 通过jvm.config文件如上配置JVM参数- 无需设置任何选项

 
Maven守护线程
Maven的守护进程是最近才加入Maven的生态系统。它的灵感来自Gradle 守护进程
Gradle 在 Java 虚拟机 (JVM) 上运行,并使用多个需要大量初始化时间的支持库。因此,有时启动似乎有点慢。这个问题的解决方案是 Gradle 守护进程:一个长期存在的后台进程,它可以比其他情况更快地执行您的构建。我们通过避免昂贵的引导过程并通过将有关项目的数据保存在内存中来利用缓存来实现这一点。
Gradle 团队很早就意识到命令行工具并不是 JVM 的最佳用法。为了解决这个问题,一个 JVM 后台进程,守护进程,总是启动。它充当服务器,而CLI本身充当客户端的角色。
作为一个额外的好处,这样一个长时间运行的进程只加载一次类(如果它们在运行之间没有改变)。
使用mvnd启动守护线程,不是通常的mvn命令。
 
并行测试执行
并行化是一项出色的技术。我们可以对测试执行做同样的事情。默认情况下,Maven Surefire 插件按顺序运行测试,但可以将其配置为并行运行测试。有关整套选项,请参阅文档
如果每个模块中有大量单元,则此方法非常有用。请注意,您的测试需要相互独立。
我们将手动设置线程数:
mvn test -Dparallel=all -DperCoreThreadCount=false -DthreadCount=16 

  • -Dparallel=all -DperCoreThreadCount=false: 
    配置 Surefire 以并行运行类和方法
  • -DthreadCount=16:
    手动覆盖线程数为 16

 
JVM参数
Maven 本身是一个基于 Java 的应用程序。这意味着每次运行都会启动一个新的JVM。JVM首先解译的字节码 和然后分析工作量和编译字节码到本地代码相应地:它意味着峰值性能,但只有经过(长)一段时间。它非常适合长时间运行的进程,而不是命令行应用程序。
我们可能不会在构建环境中达到峰值性能点,因为它们的生命周期相对较短,但我们仍在支付分析成本。我们可以通过配置足够的JVM参数来配置Maven来放弃它。有多种配置 JVM 的方法可用。最直接的方法是在项目文件夹jvm.config的.mvn子文件夹中创建一个专用的配置文件。
.mvn/jvm.config
-XX:-TieredCompilation -XX:TieredStopAtLevel=1

 
结论
在这篇文章中,我们看到了几种加速 Maven 构建的方法。总结如下:
Maven 守护进程:一个坚实、安全的起点
并行化构建:当构建包含多个相互独立的模块时
并行化测试:当项目包含多个测试时
离线:当项目包含SNAPSHOT依赖项并且您不需要更新它们时
JVM参数:当你想加倍努力时
我建议每个用户开始使用 Maven 守护进程,并在必要时根据您的项目继续优化。