Maven:如何进行并行构建?

Han*_*örr 140 build-automation build-process maven-2

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

hal*_*ave 209

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
Run Code Online (Sandbox Code Playgroud)

可以在Maven wiki上找到完整的文档.

https://cwiki.apache.org/confluence/display/MAVEN/Parallel+builds+in+Maven+3

  • _1.5_线程是什么意思?如果我有一个单核系统,这是否意味着1个线程,但双核系统会导致3个线程? (4认同)
  • @SaadMalik是的,确切地说,双核上有3个线程,四核系统上有6个线程,等等. (2认同)
  • 每个 CPU 使用超过 1 个线程有什么意义? (2认同)
  • @Enbugger某些测试可能会导致线程在测试期间部分空闲,例如在等待端点或数据库响应时。 (2认同)

小智 12

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

在maven'standalone'中支持这个也很不错,通过maven问题跟踪器快速浏览一下:http://jira.codehaus.org/browse/MNG-3004


Joh*_*nny 9

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

因此,当使用Maven并行构建时:

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
Run Code Online (Sandbox Code Playgroud)

可能会出现一些测试问题.注意测试中的任何行为,在串行和并行测试执行之间是不同的.它发生的大部分时间都是为了在资源方面不合适地测试隔离.

例如,test1使用密钥12345操作数据库条目,密钥12345是硬编码的,test2使用相同的条目!这可不是很好......

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

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

mvn clean install -T 4 -DskipTests
Run Code Online (Sandbox Code Playgroud)

  • 这不是问题的重点,也不是好的建议。在并行执行中中断的测试是糟糕的测试,它们也可能表明代码设计不好。最好是倾听并采取行动。跳过测试来解决这个问题只是把一些东西隐藏起来。 (11认同)
  • https://cwiki.apache.org/confluence/display/MAVEN/Parallel+builds+in+Maven+3 (2认同)
  • 运行并行构建时,它们的测试阶段也是并行的,因此请确保禁用调试,因为调试端口的分配会默默地破坏并行构建。 (2认同)