2012-03-30 12 views
14

Próbuję wykonać następujący scenariusz przy użyciu Maven:Process zrodził blokami Exec-maven-plugin procesu Maven

  1. pre-integracja-fazowe: Uruchom aplikację Java przy użyciu główne klasy (przy użyciu exec -maven-plugin)
  2. integracja faza: Uruchom przypadków testowych (integracja za pomocą Maven-failsafe-plugin)
  3. post-integracja-fazowe: Zatrzymaj aplikację wdzięcznie (za pomocą exec-maven-plugin)

Oto p om.xml ciach:

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

Gdybym wykonać mvn post-test integracyjny, mój wniosek jest rozpoczęcie pracy jako procesu potomnego procesu maven, ale proces aplikacja blokuje proces maven z wykonaniem testów integracyjnych który pojawia się w kolejnej fazie. Później odkryłem, że w dodatku maven exec jest bug (or missing functionality?), z powodu którego proces aplikacji blokuje proces maven. Aby rozwiązać ten problem, zamknąłem inwokację MyApp.java w skrypcie powłoki, a następnie dodałem "/ dev/null 2> ", aby utworzyć oddzielny proces w tle. Oto wycinek (jest to tylko wycinek, a nie rzeczywista jeden) z runTest.sh:

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

Mimo to rozwiązuje mój problem, czy jest jakiś inny sposób to zrobić? Czy brakuje mi argumentu dotyczącego exec-maven-plugin?

Odpowiedz

1

Jest możliwym rozwiązaniem w tym wątku, używając Ant: Możliwe rozwiązanie tutaj: Maven and Exec: forking a process?

Ta sama wada jak w bieżącym rozwiązania jest to, że jest to platforma zależne, jak również. Twoje obecne rozwiązanie działa tylko w środowiskach Unix/Linux, a rozwiązanie antywirusowe uruchamia instancję cmd, która działa tylko w systemie Windows. Korzystając z profili Maven, można stworzyć konfigurację, która używa systemu operacyjnego, na którym działa, aby określić, która z powłok poleceń ma zostać uruchomiona.

+0

Tak, masz rację. Windows będzie problemem z moją poprawką. –

1

(Tylko Unix) Użyj exec: exec i uruchom skrypt. Ten skrypt powinien wywołać

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

pierwszy i sprawdzić uruchomienie zanim zakończy skrypt. Czy program się zawiesił w ciągu 2 sekund?

Gdy aplikacja Java potrzebuje trochę czasu, aby rozpocząć, możesz dodać skrypt, który czeka na kompletne uruchomienie.

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} 
Powiązane problemy