2012-03-30 13 views
14

Estoy tratando de ejecutar el siguiente escenario usando Maven:proceso generado por los bloques exec-experto-plugin el proceso de experto

  1. integración previa de fase: Iniciar una aplicación basada en Java usando una clase principal (utilizando Exec -maven-plugin)
  2. integración de fase: Ejecutar los casos de prueba de integración (usando maven-a prueba de fallos-Plugin)
  3. post-integración-fase: Detener la aplicación con gracia (usando exec-maven-plugin)

Aquí está p om.xml SNIP:

<plugins> 
    <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>exec-maven-plugin</artifactId> 
     <version>1.2.1</version> 
     <executions> 
      <execution> 
       <id>launch-myApp</id> 
       <phase>pre-integration-test</phase> 
       <goals> 
        <goal>exec</goal> 
       </goals> 
      </execution> 
     </executions> 
     <configuration> 
      <executable>java</executable> 
      <arguments> 
       <argument>-DMY_APP_HOME=/usr/home/target/local</argument> 
       <argument>-Djava.library.path=/usr/home/other/lib</argument> 
       <argument>-classpath</argument> 
       <classpath/> 
       <argument>com.foo.MyApp</argument> 
      </arguments> 
     </configuration> 
    </plugin> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-failsafe-plugin</artifactId> 
     <version>2.12</version> 
     <executions> 
      <execution> 
       <goals> 
        <goal>integration-test</goal> 
        <goal>verify</goal> 
       </goals> 
      </execution> 
     </executions> 
     <configuration> 
      <forkMode>always</forkMode> 
     </configuration> 
    </plugin> 
</plugins> 

Si ejecuto post-integración-mvn test, mi solicitud es empezar como un proceso hijo del proceso experto, pero el proceso de aplicación está bloqueando el proceso de experto de la ejecución de las pruebas de integración que viene en la próxima fase. Más tarde descubrí que hay un bug (or missing functionality?) en el complemento maven exec, debido a que el proceso de aplicación bloquea el proceso de maven. Para abordar este problema, he encapsulado la invocación de MyApp.java en un script de shell y luego he añadido "/ dev/null 2> " para engendrar un proceso de fondo separado. Aquí está el recorte (esto es sólo una ganga y no el real) de runTest.sh:

java - DMY_APP_HOME =$2 com.foo.MyApp > /dev/null 2>&1 & 

Aunque esto resuelve mi problema, ¿hay alguna otra manera de hacerlo? ¿Me estoy perdiendo cualquier argumento para exec-maven-plugin?

Respuesta

1

Hay una posible solución a este hilo utilizando Ant: Posible solución aquí: Maven and Exec: forking a process?

La misma desventaja que en su solución actual es que es dependiente de la plataforma también. Su solución actual solo se ejecutará en entornos similares a Unix/Linux, mientras que la solución basada en Ant está iniciando una instancia de cmd, que solo funciona en Windows. Usando perfiles de Maven, se podría crear una configuración que use el sistema operativo en el que se está ejecutando para determinar qué caparazón de comandos se debe iniciar, por supuesto.

+0

Sí, tiene usted razón. Windows va a ser un problema con mi solución. –

1

(Unix solamente) Utilice exec: exec y comience una secuencia de comandos. Este script debe llamar

java -DMY_APP_HOME =$2 com.foo.MyApp > /dev/null 2>&1 & 

primero, y comprobar la puesta en marcha antes de que finalice la secuencia de comandos. ¿Se bloqueó el programa en 2 segundos?

Cuando su aplicación Java necesita algo de tiempo para comenzar, puede agregar una secuencia de comandos que espera un inicio completo.

retrymax=30 
    retry=0 
    RETURNCODE=1 
    while [ ${retry} -lt ${retrymax} ]; do 
     todo_your_test 
     RETURNCODE=$? 
     if [ ${RETURNCODE} -eq 0 ]; then 
     echo MyApp started 
     break 
     else 
     ((retry = retry + 1)) 
     sleep 2 
     fi 
    done 
    exit ${RETURNCODE} 
Cuestiones relacionadas