何时在Maven中使用MojoExecutionException与MojoFailureException

时间:2009-06-23 15:07:19

标签: maven-2 maven-plugin

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] ------------------------------------------------------------------------

什么时候应该抛出哪个例外以及为什么?

2 个答案:

答案 0 :(得分:31)

如果问题导致无法继续构建,您似乎应该抛出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

答案 1 :(得分:2)

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

如果无法继续,请抛出一个MavenExecutionException - 说你发现了一个不可恢复的状态,就像你正在尝试编译而且项目无法编译,因此之后的所有内容都会毫无结果。

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

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

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

mvn -fn不要失败。如果您想忽略例如失败的集成测试但仍然mvn deploy

,这将非常有用