【问题标题】:How can I fail Maven build if exec:java goal fails?如果 exec:java 目标失败,如何使 Maven 构建失败?
【发布时间】:2011-01-22 17:06:28
【问题描述】:

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

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

【问题讨论】:

  • 是否可以使用 exec:exec,在这种情况下我猜你可以使用返回码?

标签: maven-2


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我刚刚用 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 集成测试 [INFO] 正在扫描项目... [信息] --------------------------------------------- ------------------------- [INFO] 楼q2363055 [INFO] 任务段:[clean, integration-test] [信息] --------------------------------------------- ------------------------- ... [INFO] [jar:jar {执行:default-jar}] [信息] 构建 jar:/home/pascal/Projects/stackoverflow/q2363055/target/q2363055-1.0-SNAPSHOT.jar [信息] 准备执行:java [警告] 删除:java 从分叉生命周期中,以防止递归调用。 [INFO] 项目不需要目标 - 跳过 [信息] [执行:java {执行:my-exec-java}] [信息] --------------------------------------------- ------------------------- [错误] 构建错误 [信息] --------------------------------------------- ------------------------- [INFO] 执行 Java 类时发生异常。空值 出现问题 [信息] --------------------------------------------- ------------------------- [INFO] 有关更多信息,请使用 -e 开关运行 Maven [信息] --------------------------------------------- ------------------------- [INFO] 总时间:19 秒 [INFO] 完成时间:Tue Mar 02 23:40:32 CET 2010 [INFO] 最终内存:16M/79M [信息] --------------------------------------------- -------------------------

      integration 阶段永远不会执行,因为构建错误。

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

      【讨论】:

      • 谢谢帕斯卡。我有机会查看源代码并看到许多未处理的错误。如果被调用的类有更好的异常处理,我相信你的解决方案会起作用。感谢您的全面回答!
      • 谢谢!我在启动 HSQLDB 时遇到了同样的问题。抛出异常并且未显示。我在上面遇到了同样的错误!我将无效的 s 传递给 hsqldb ............
      【解决方案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

      如果由于某种原因这些都不适合,则另一个选择是将 AntRun 插件与 &lt;java .../&gt; 任务一起使用。项目依赖也可以传入。

      【讨论】:

      • 感谢 Brett,我最终使用了 antrun 插件。
      • 我正在尝试将 exec:exec 与 java main 一起使用,因为我需要控制退出代码,并且当它到达 System.exit(-1) 时它会终止构建,即使它是应该在子进程中运行。怎么办?
      猜你喜欢
      • 1970-01-01
      • 2015-05-10
      • 1970-01-01
      • 2020-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多