14

Ich versuche, das folgende Szenario mit Maven ausführen:Prozess erzeugt durch exec-Maven-Plugin blockiert der Maven-Prozess

  1. Vorintegration-Phase: Anfangen basierte Anwendung Java eine Hauptklasse mit (mit exec -maven-Plugin)
  2. Integration-Phase: Führen Sie die Integration von Testfällen (mit maven-Fail-safe-Plugin)
  3. post-Integration-Phase: die Anwendung beenden anmutig (exec-maven-Plugin)
mit

Hier ist p om.xml schnippeln:

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

Wenn ich mvn post-Integration-Test ausführen, wird meine Bewerbung als Kindprozess des Maven-Prozess begonnen, aber die Anwendung Prozess blockiert den Maven Prozess die Integrationstests von der Ausführung was in der nächsten Phase kommt. Später fand ich, dass es ein bug (or missing functionality?) in maven exec-Plugin gibt, aufgrund dessen der Anwendungsprozess den Maven-Prozess blockiert. Um dieses Problem zu beheben, habe ich den Aufruf von MyApp.java in einem Shell-Skript gekapselt und dann "/ dev/null 2> " angefügt, um einen separaten Hintergrundprozess zu erzeugen. Hier ist der Schnipsel (dies ist nur ein Schnipsel und nicht die tatsächlichen eins) von runTest.sh:

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

Obwohl dies mein Problem löst, ist es eine andere Möglichkeit, es zu tun? Fehle ich irgendein Argument für exec-maven-plugin?

Antwort

1

Es gibt eine mögliche Lösung in diesem Thread mit Ant: Mögliche Lösung hier: Maven and Exec: forking a process?

der gleiche Nachteil wie in der aktuellen Lösung ist, dass es Plattform auch abhängig. Ihre aktuelle Lösung wird nur in Unix/Linux-ähnlichen Umgebungen ausgeführt, während die Ant-basierte Lösung eine Instanz von cmd startet, die nur unter Windows funktioniert. Mit Hilfe von Maven-Profilen könnte man eine Konfiguration erstellen, die das Betriebssystem, auf dem sie läuft, erstellt, um zu bestimmen, welche Befehlshülle natürlich gestartet werden soll.

+0

Ja, Sie haben Recht. Windows wird ein Problem mit meinem Update sein. –

1

(nur Unix) Verwenden Sie exec: exec und starten Sie ein Skript. Dieses Skript sollte

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

zuerst nennen, und das Start überprüfen, bevor das Skript beendet. Ist das Programm in 2 Sekunden abgestürzt?

Wenn Ihre Java-App etwas Zeit zum Starten benötigt, können Sie ein Skript hinzufügen, das auf einen vollständigen Start wartet.

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} 
Verwandte Themen