Как я могу завершить сборку Maven, если цель exec: java не удалась? - PullRequest
9 голосов
/ 02 марта 2010

Мы используем цель Maven exec:java для запуска пользовательского Java-приложения, которое настраивает базу данных для использования с нашими интеграционными тестами.Мы хотим использовать exec:java сверх exec:exec, чтобы иметь возможность использовать зависимости проекта в пути к классу основного класса, который будет использоваться.Несколько раз приложение не работало по уважительным причинам, но сборка Maven продолжалась, как будто ничего не пошло не так.

Есть ли какой-либо аргумент типа "failonerror", который можно использовать с exec:java?Я боюсь добавлять system.exit() коды к классу, который запускается, так как я подозреваю, что он убьет не только себя, но и самого Maven из-за того, что он работает в виртуальной машине Maven.

Ответы [ 4 ]

13 голосов
/ 03 марта 2010

Я только что провел простой тест со следующей конфигурацией плагина, объявленной в 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, который загружает вашу базу данных? Является ли выбрасывание исключения опцией?

4 голосов
/ 03 марта 2010

Это не та функция, которая есть по умолчанию, но вы можете запросить ее у 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 с задачей <java .../>. Зависимости проекта также могут быть переданы в это.

1 голос
/ 12 марта 2012

Для цели Java System.exit (n), где n не равно нулю, работать не будет. Нужно скинуть java исключение.

0 голосов
/ 10 августа 2011

В дополнение к генерации исключения вы также можете использовать System.exit(n), где n не ноль, чтобы вызвать сбой сборки maven.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...