2012-03-30 65 views
14

我想使用maven執行以下情形催生:過程執委會,Maven的插件模塊Maven的過程

  1. 預集成階段:開始使用主類的基於java的應用程序(使用EXEC -maven-插件)
  2. 整合階段:運行集成測試用例(使用maven-故障保護,插件)
  3. 整合階段後:正常停止的應用程序(使用EXEC - Maven的插件)

這裏是p om.xml剪斷:

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

如果我執行MVN後的集成測試,我的應用程序入門作爲行家進程的子進程,但該應用程序是從執行集成測試阻止Maven的過程進入下一個階段。後來我發現maven exec插件中有一個bug (or missing functionality?),因爲應用程序進程阻塞了maven進程。爲了解決這個問題,我將MyApp.java的調用封裝在shell腳本中,然後附加「/ dev/null 2> &」以產生單獨的後臺進程。這裏是剪斷(這只是剪斷,而不是實際的)從runTest.sh:

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

雖然這解決了我的問題,有沒有其他的辦法做到這一點?我是否缺少exec-maven-plugin的任何參數?

回答

1

有沒有在使用Ant這個線程可能的解決辦法:可能的解決辦法在這裏:Maven and Exec: forking a process?

相同的缺點在你目前的解決方案是,它是依賴於平臺的爲好。您當前的解決方案只能在類Unix/Linux環境中運行,而基於Ant的解決方案則啓動僅適用於Windows的cmd實例。使用Maven配置文件,可以創建一個配置,使用它所運行的操作系統來確定要啓動的命令外殼。

+0

是的,你是對的。 Windows將成爲我的修復程序的問題。 – 2012-03-30 10:05:23

1

(僅適用於Unix) 使用exec:exec並啓動腳本。 這個腳本應該叫

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

第一,並檢查啓動腳本完成之前。 程序在2秒內崩潰了嗎?

當您的java應用程序需要一些時間來啓動時,您可以添加一個腳本來等待完整的啓動。

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}