【问题标题】:When to use MojoExecutionException vs MojoFailureException in Maven何时在 Maven 中使用 MojoExecutionException 与 MojoFailureException
【发布时间】:2010-11-05 05:04:53
【问题描述】:

AbstractMavenMojo 的 execute 方法声明它抛出两个异常,MojoExecutionException 和 MojoFailureException。抛出任何一个都会导致构建停止,并且在每种情况下,日志都会显示几乎相同的消息。

MojoExecutionException 的消息是:

[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] [exception text]
[INFO] ------------------------------------------------------------------------
[INFO] For more information, run Maven with the -e switch
[INFO] ------------------------------------------------------------------------

MojoFailureException 的消息是:

[INFO] ------------------------------------------------------------------------
[ERROR] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] [exception text]
[INFO] ------------------------------------------------------------------------
[INFO] For more information, run Maven with the -e switch
[INFO] ------------------------------------------------------------------------

什么时候应该抛出哪个异常以及为什么?

【问题讨论】:

    标签: maven-2 maven-plugin


    【解决方案1】:

    如果问题导致无法继续构建,您似乎应该抛出MojoExecutionException,否则使用MojoFailureException

    您可以控制在运行 maven 时处理 MojoFailureExpections 的行为。

    以下链接详细说明了区别:https://books.sonatype.com/mvnref-book/reference/writing-plugins-sect-custom-plugin.html#writing-plugins-sect-failure
    断开的链接?谷歌搜索 sonatype writing-plugins-sect-custom-plugin writing-plugins-sect-failure

    【讨论】:

    • 链接已损坏。请改用sonatype.com/books/mvnref-book/reference/…
    • 如果我理解你的答案(以及本书的“编写自定义插件”部分),如果用户为我的 maven 插件提供了无效配置,我应该抛出 MojoExecutionException?
    【解决方案2】:

    如果您的构建步骤失败但可以忽略它(例如您可能希望忽略失败的测试),则抛出 MavenFailureException

    如果无法继续,请抛出MavenExecutionException - 假设您检测到无法恢复的情况,例如您正在尝试编译并且无法编译项目,因此之后的一切都将毫无结果。

    MavenExecutionException 将始终终止构建,而 MavenFailureException 的行为是可配置的。

    默认行为是快速失败,即与构建错误相同的行为,这通常是您想要的。您可以通过传递命令行标志来改变行为:

    mvn -fae最后失败,即每个构建步骤都会执行,如果一个阶段失败,您可能会遇到后续失败,只有在每个步骤执行完后整个构建才会失败。

    mvn -fn 不会失败。如果您想忽略例如失败的集成测试但仍然要忽略 mvn deploy,这将非常有用。

    【讨论】:

      猜你喜欢
      • 2021-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-29
      • 2014-05-04
      • 1970-01-01
      • 2020-08-20
      • 1970-01-01
      相关资源
      最近更新 更多