2010-03-02 5 views
9

Estamos utilizando el objetivo Maven exec:java para ejecutar una aplicación java personalizada que configura una base de datos para usar con nuestras pruebas de integración. Queremos usar exec:java sobre exec:exec para poder usar las dependencias del proyecto en el classpath de la clase principal que se utilizará. Algunas veces la aplicación ha fallado por razones válidas, pero la compilación de Maven continuó como si nada hubiese salido mal.¿Cómo puedo dejar de construir si Maven si el ejecutivo: el objetivo de Java falla?

¿Hay algún argumento de tipo "error de error" que se pueda usar con exec:java? Tengo miedo de agregar system.exit() códigos a la clase que se está ejecutando, ya que sospecho que no solo matará a sí mismo, sino también a Maven, debido a que se está ejecutando en Maven VM.

+0

¿es posible usar exec: exec, en ese caso supongo que puede usar códigos de retorno? –

Respuesta

13

que acabo de hacer una prueba sencilla con la siguiente configuración del plugin declarado en un 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> 

Y la siguiente clase Java:

package com.example; 

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

Y esto es lo que me pasa cuando se invoca el integration-test fase:

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

ElLa fase 210 nunca se ejecuta debido al error de compilación.

Entonces la pregunta es, ¿cómo se manejan los errores en la clase Java que carga su db? ¿Lanzar una excepción es una opción?

+0

Gracias Pascal. He tenido la oportunidad de ver la fuente y ver muchos errores no controlados. Creo que su solución funcionaría si la clase que se llama tuviera un mejor manejo de excepciones. Gracias por la respuesta completa! –

+0

Gracias! Tuve el mismo problema al iniciar HSQLDB. Se arrojó una excepción y no se muestra. ¡Obtuve el mismo error arriba! Estaba pasando inválido s a hsqldb .......... – Derek

4

Esta no es una función que tiene de forma predeterminada, pero es posible que desee solicitarlo en http://jira.codehaus.org/browse/MEXEC, ya que sería una simple adición.

Si desea que exec:java falle la construcción, la llamada main deberá arrojar una excepción en lugar de devolver un código de salida distinto de cero.

Si no es una opción, aún puede usar exec:exec - consulte http://mojo.codehaus.org/exec-maven-plugin/examples/example-exec-for-java-programs.html para obtener una descripción sobre cómo agregar las dependencias del proyecto al classpath.

Otra opción si ninguno de estos trajes por alguna razón es usar el plugin AntRun con la tarea <java .../>. Las dependencias del proyecto también se pueden pasar a eso.

+1

Gracias Brett, terminé usando el plugin antrun al final. –

0

Además de lanzar una excepción, también puede usar System.exit(n), donde n es distinto de cero para provocar la falla de la construcción maven.

1

Para java goal System.exit (n) donde n es distinto de cero no funcionará. Necesita lanzar la excepción java.

Cuestiones relacionadas