ChatGPT解决这个技术问题 Extra ChatGPT

Maven:如何进行并行构建?

当您在多核/多 CPU 机器上使用 maven 构建时,通常可以并行构建不同的子项目。有没有办法用maven做到这一点?有这个/什么的插件吗?


S
Sergey Vyacheslavovich Brunov

Maven 3(从 beta 1 开始)现在支持并行构建作为实验性功能。

例如,

mvn -T 4 clean install # Builds with 4 threads
mvn -T 1C clean install # 1 thread per cpu core
mvn -T 1.5C clean install # 1.5 thread per cpu core

完整的文档可以在 Maven wiki 上找到:Parallel builds in Maven 3 - Apache Maven - Apache Software Foundation


1.5线程是什么意思?如果我有一个单核系统,这是否意味着 1 个线程,但双核系统导致 3 个线程?
@SaadMalik 是的,确切地说,双核上有 3 个线程,四核系统上有 6 个线程,等等。
有没有我们可以为 JVM 使用的参数,所以我们可以在 eclipse 中使用它?
每个 CPU 使用超过 1 个线程有什么意义?
@Enbugger 某些测试可能会导致线程在测试期间部分空闲,例如在等待端点或数据库响应时。
S
Sergey Vyacheslavovich Brunov

建议的解决方案很棒,但我想在这里添加一些关于并行构建期间测试稳定性的答案。

因此,当使用 Maven parallel build 时:

mvn -T 4 clean install # Builds with 4 threads
mvn -T 1C clean install # 1 thread per cpu core
mvn -T 1.5C clean install # 1.5 thread per cpu core

可能会出现一些测试问题。注意测试中串行和并行测试执行之间不同的任何行为。大多数情况下,它发生在不正确的测试隔离资源方面。

例如,test1 使用键 12345 操作数据库条目,该键是硬编码的,test2 使用相同的条目!不可能是好的……

这是一种首先应该考虑的情况,但有时它会被遗忘,一旦切换到并行 maven 构建,可能会导致不同的问题。

如果发生这种情况,并且您至少在某些情况下仍希望使用并行执行,您可以(当然,除了尝试修复测试并使其正确隔离)使用 -DskipTests 参数到 disable Maven test runs

mvn clean install -T 4 -DskipTests

这不是问题的重点,也不是好的建议。在并行执行中中断的测试是不好的测试,它们也可能表明代码设计不好。最好倾听并采取行动。跳过测试来解决这个问题只是在地毯下扫过一些东西。
它是如何相关的?当有人在他的测试中引入并行执行时,它可能会发生。这只是实用主义。
运行并行构建时,它们的测试阶段也是并行的,因此请确保禁用调试,因为调试端口的分配会默默地中断并行构建。
j
jor

一些 CI 构建应用程序(例如 hudson)可以同时构建多个 maven 项目(甚至在多台机器上)。

在 maven 'standalone' 中对此的支持也很好,快速浏览一下 maven 问题跟踪器给了我:http://jira.codehaus.org/browse/MNG-3004


我认为同时用于多个 maven 项目的 Hudson 功能被破坏,如 MNG-3004 JIRA 评论中所示。
J
JonnyRaa

如果您来这个问题是为了整理您的构建服务器,并且您没有使用本机处理 maven 的服务器,那么您正在寻找的魔法标志是这样的:

-Dmaven.repo.local=someNoneGlobalDir

对你的每一个构建都这样做,你可以让它们同时运行,而不是让所有使用 maven 的东西都排在队列中!