2012-12-28 46 views
3

推出我使用exec-Maven的插件來運行Java應用程序的Java應用程序:終止從行家

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>exec-maven-plugin</artifactId> 
    <executions> 
     <execution> 
      <id>upload-res</id> 
      <phase>package</phase> 
      <goals> 
       <goal>exec</goal> 
      </goals> 
      <configuration> 
       <executable>java</executable> 
       <arguments> 
             <argument>${jvmEncoding}</argument> 
             <argument>${jvmMaxPermSize}</argument> 
        <argument>-classpath</argument> 
        <classpath /> 
        <argument>${myClass}</argument> 
       </arguments> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

應用程序可以爲潛在取決於互聯網連接一些分鐘。如果我簡單地終止:

mvn clean install 

的lauched應​​用程序完成之前它仍然在後臺運行。如果Maven構建被中斷,是否有可能終止Java應用程序?

+0

首先我會想你爲什麼要在包生命週期階段啓動一個應用程序,因爲它聽起來像集成測試,而不是在集成測試階段應該完成的。永遠不要讓它停止,你可以使用maven-exec-plugin的** java **目標來代替對進程的更多控制。 – khmarbaise

+0

使用java目標是不可能的,因爲我需要爲jvm提供參數。看到這個底部:http://mojo.codehaus.org/exec-maven-plugin/usage.html。 – u123

+0

好的。失察。 – khmarbaise

回答

1

難點在於JVM是在單獨的進程中啓動的,並且不能再使用直接的JVM Java代碼與它進行通信。您需要某種進程間通信。有兩種方法可以做到這一點:1)讓你的應用程序在端口上監聽信號,並讓它自行終止,或2)在某處記錄進程的PID,然後發出操作系統kill命令。兩者都很醜陋。

最好的方法取決於應用程序是什麼。當我們啓動Jetty進行調試時,我們使用選項1。一些應用程序服務器會自動偵聽終止信號。