如果exec:java目标失败,我怎么能失败Maven构建?

时间:2010-03-02 12:31:49

标签: maven-2

我们正在使用Maven exec:java目标来运行自定义Java应用程序,该应用程序配置数据库以用于我们的集成测试。我们希望使用exec:java而不是exec:exec来使用要在主类的类路径中使用的项目依赖项。 由于正当理由,应用程序失败了几次,但Maven构建仍然没有出现任何问题。

是否有可以与exec:java一起使用的“failonerror”类型参数?我害怕将system.exit()代码添加到正在运行的类中,因为我怀疑它不仅会杀死它自己,还会杀死Maven本身,因为它在Maven VM中运行。

4 个答案:

答案 0 :(得分:13)

我刚刚使用POM中声明的以下插件配置进行了简单的测试:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.1</version>
        <executions>
          <execution>
            <id>my-exec-java</id>
            <phase>pre-integration-test</phase>
            <goals>
              <goal>java</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <mainClass>com.example.Main</mainClass>
        </configuration>
      </plugin>
      ...
    </plugins>
    ...
  </build>
</project>

以下Java类:

package com.example;

public class Main {
    public static void main(String[] args) {
        throw new RuntimeException("A problem occured");
    }
}

这是我在调用integration-test阶段时得到的结果:

$ mvn clean integration-test
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building q2363055
[INFO]    task-segment: [clean, integration-test]
[INFO] ------------------------------------------------------------------------

...

[INFO] [jar:jar {execution: default-jar}]
[INFO] Building jar: /home/pascal/Projects/stackoverflow/q2363055/target/q2363055-1.0-SNAPSHOT.jar
[INFO] Preparing exec:java
[WARNING] Removing: java from forked lifecycle, to prevent recursive invocation.
[INFO] No goals needed for project - skipping
[INFO] [exec:java {execution: my-exec-java}]
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] An exception occured while executing the Java class. null

A problem occured
[INFO] ------------------------------------------------------------------------
[INFO] For more information, run Maven with the -e switch
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 19 seconds
[INFO] Finished at: Tue Mar 02 23:40:32 CET 2010
[INFO] Final Memory: 16M/79M
[INFO] ------------------------------------------------------------------------

由于构建错误,integration阶段永远不会被执行。

所以问题是,你如何处理加载数据库的Java类中的错误?抛出异常是一种选择吗?

答案 1 :(得分:4)

这不是默认情况下的功能,但您可能希望在http://jira.codehaus.org/browse/MEXEC申请,因为这只是一个简单的添加。

如果您希望exec:java使构建失败,main调用将需要抛出异常而不是返回非零退出代码。

如果这不是一个选项,您仍然可以使用exec:exec - 请参阅http://mojo.codehaus.org/exec-maven-plugin/examples/example-exec-for-java-programs.html以获取有关如何将项目依赖项添加到类路径的说明。

如果出于某种原因这两种情况都不适合使用带有<java .../>任务的AntRun插件,则可以选择另一个选项。项目依赖项也可以传递给它。

答案 2 :(得分:1)

对于java目标System.exit(n),其中n为非零将不起作用。需要抛出java异常。

答案 3 :(得分:0)

除了抛出异常外,您还可以使用System.exit(n),其中n非零,导致maven构建失败。

相关问题