【问题标题】:How to compile all maven modules even if tests fail, but fail overall build if any tests fail即使测试失败,如何编译所有 Maven 模块,但如果任何测试失败,则整体构建失败
【发布时间】:2014-07-13 01:41:52
【问题描述】:

上下文:我想在多模块项目中编译和测试所有模块,但如果有任何失败编译或测试我希望整个构建失败

默认配置要么在第一次失败时停止,要么在测试失败后跳过模块

跑步:

mvn 全新安装

在第一个失败的模块处停止。

如果你添加:

mvn clean install -fae //最后失败

然后运行所有模块,但如果测试失败,则跳过任何依赖模块:



    [INFO] ------------------------------------------------------------------------
    [INFO] Reactor Summary:
    [INFO] ------------------------------------------------------------------------
    [INFO] Module A ............................................. SUCCESS [15.210s]
    [INFO] Module B ............................................. SUCCESS [10.923s]
    [INFO] Module C ............................................. FAILED [1.731s]
    [INFO] Module D ............................................. SUCCESS [3.791s]
    [INFO] Module E ............................................. SUCCESS [1.488s]
    [INFO] Module F ............................................. SKIPPED (dependency build failed or was skipped)
    [INFO] Module G ............................................. SKIPPED (dependency build failed or was skipped)
    [INFO] Module H ............................................. SKIPPED (dependency build failed or was skipped)
    [INFO] Module I ............................................. SUCCESS [1.690s]
    [INFO] -----------------------------------------

另一个强制所有模块编译的选项是:

mvn clean install -fn //永远不会失败

但这会导致测试失败时构建通过



    [INFO] ------------------------------------------------------------------------
    [INFO] Reactor Summary:
    [INFO] ------------------------------------------------------------------------
    [INFO] Module A ............................................. SUCCESS [15.210s]
    [INFO] Module B ............................................. SUCCESS [10.923s]
    [INFO] Module C ............................................. FAILED [1.731s]
    [INFO] Module D ............................................. SUCCESS [3.791s]
    [INFO] Module E ............................................. SUCCESS [1.488s]
    [INFO] Module F ............................................. SUCCESS [9.062s]
    [INFO] Module G ............................................. SUCCESS [16.324s]
    [INFO] Module H ............................................. SUCCESS [4.032s]
    [INFO] Module I ............................................. SUCCESS [1.690s]
    [INFO] ------------------------------------------------------------------------
    [INFO] Error for project: Module C (during install)
    [INFO] ------------------------------------------------------------------------
    [INFO] There are test failures.

    Please refer to C:\MavenBuildDir\ModuleC\surefire-reports for the
    individual test results.
    [INFO] ------------------------------------------------------------------------
    [INFO] For more information, run Maven with the -e switch
    [INFO] ------------------------------------------------------------------------
    [INFO]  + Ignoring failures
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESSFUL
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 30 minutes 38 seconds
    [INFO] Finished at: Fri May 23 16:42:08 BST 2014
    [INFO] Final Memory: 39M/185M

谁能建议一组选项来实现以下目标:

  1. 编译所有模块
  2. 在所有模块上运行测试
  3. 如果模块的测试失败,但代码编译依赖的模块仍然得到编译和测试

非常感谢您的回复 - 否则,如果有多个问题,我们必须在构建服务器上重复运行测试 - 耗费大量时间。

【问题讨论】:

  • 有什么更新吗?你是怎么解决这个问题的?
  • 感谢您提出这个问题!这是我能找到的唯一真正显示-fae 影响构建的位置/方式的地方!没有任何文档说明-fae 是否会影响编译失败。

标签: maven testing


【解决方案1】:

我建议使用:

mvn -Dmaven.test.failure.ignore=true --fail-at-end clean install

【讨论】:

  • 感谢您的回复 - 我会试一试。一旦我测试了这些设置就会接受。
  • 我已经尝试过了,但不幸的是它仍然会跳过模块。 On 选项可能是 mvn clean install -fn //fail never 后跟 mvn clean install,因此构建失败。但讨厌,因为需要再次运行。我暂时不回答这个问题,可能会用 Sonatype 发布这个问题。
  • 这似乎和使用--fail-never运行一样?
  • 这会导致应该失败的模块报告成功,而不是只允许依赖它们的模块运行测试。
【解决方案2】:

我建议将其拆分为两个 mvn 调用:

mvn clean compile
mvn -fae install

如果出现编译错误,第一次调用将失败。第二个调用将重用已编译的 .class 文件,因为省略了“clean”。如果有测试失败,它将在最后失败。但是所有模块的编译已经完成。

【讨论】:

  • 感谢您的回复。 khmarbaise 的建议避免了编译两次的需要,我也希望第一次调用在第一个错误时失败,而第二次调用则跳过后续错误。然而,编译一次的隐含效率意味着如果它有效,我会更喜欢这个答案。
  • 一旦测试失败,这个解决方案仍然会跳过依赖模块——这是问题的目的——所以这不起作用。我考虑过执行 mvn clean install -fae -Dmaven.test.skip=true 来构建所有没有测试的模块,然后 mvn test -fae 来运行所有测试。但不喜欢两个 maven 调用。
  • install 将重新运行compile,因为它是the relevant lifecycle 中的上一步,并且所有以前的步骤都将重新运行。 clean 除了删除已编译的类文件之外,还进行了额外的清理工作。
【解决方案3】:

这是一种不同的方法:解析 maven 输出。所以要么你

【讨论】:

    猜你喜欢
    • 2013-12-01
    • 1970-01-01
    • 2013-12-12
    • 2020-01-16
    • 2015-04-25
    • 2013-05-24
    • 1970-01-01
    • 2014-10-26
    • 2015-02-03
    相关资源
    最近更新 更多