2010-03-02 109 views
9

我们使用Maven exec:java的目标来运行一个自定义Java应用程序,该应用程序配置数据库以用于我们的集成测试。我们希望使用而不是exec:exec能够使用要使用的主类的类路径中的项目依赖关系。 由于有效的原因,应用程序出现了几次失败,但Maven构建继续进行,就好像没有任何问题。如果exec:java目标失败,我该如何失败Maven构建?

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

+0

是否有可能使用exec:exec,在这种情况下,我猜你可以使用返回码? – 2010-03-02 12:51:54

回答

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

由于构建错误,210阶段从不执行。

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

+0

谢谢帕斯卡。我有机会查看源代码并看到很多未处理的错误。如果被调用的类具有更好的异常处理,我相信你的解决方案可以工作。感谢您的全面回答! – 2010-03-03 16:40:59

+0

谢谢!我有同样的问题启动HSQLDB。抛出异常并且不显示。我上面得到了同样的错误!我通过无效的 s到hsqldb .......... – Derek 2011-05-18 08:50:23

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插件,则可以使用其他选项。项目依赖关系也可以传递给它。

+1

感谢Brett,我最终使用了antrun插件。 – 2010-03-03 16:42:04

0

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

1

对于java目标System.exit(n),其中n是非零将无法正常工作。需要抛出java异常。

相关问题