2016-02-17 3 views
2

Cette question est le résultat d'une réponse à cette question d'hierarrêter Gracieusement un processus java commencé par maven-antrun-plugin

run a java application and a web application in a single maven build within a reactor project

Afin de répondre par la question ci-dessus j'ai maintenant un maven- antrun-plugin qui bifurque un processus enfant et exécute mon java en utilisant une configuration serveur d'applications comme celui-ci -

<plugin> 
<artifactId>maven-antrun-plugin</artifactId> 
<version>1.8</version> 
<executions> 
<execution> 
    <phase> verify </phase> 
    <configuration> 
    <target> 
     <property name="runtime_classpath" refid="maven.runtime.classpath" /> 
     <exec executable="java" spawn="true"> 
     <arg value="-classpath"/> 
     <arg value="${runtime_classpath}"/> 
     <arg value="somepackage.AppServer"/> 
     </exec> 
    </target> 
    </configuration> 
    <goals> 
    <goal>run</goal> 
    </goals> 
</execution> 
</executions> 
</plugin> 

La configuration ci-dessus commence en douceur mon serveur d'applications comme un processus d'arrière-plan.

Maintenant, ma question est de savoir s'il y a un moyen facile de localiser ce processus et de l'arrêter si j'en ai besoin après l'avoir démarré.

Répondre

3

Vous pouvez utiliser l'utilitaire jps qui est fourni à l'intérieur du JDK pour obtenir le processus ID d'un exécutant exécutable Java:

L'outil jps énumère les sur le système cible instrumentés HotSpot machines virtuelles Java (JVM) . L'outil est limité à la génération d'informations sur les machines virtuelles Java pour lesquelles il dispose des autorisations d'accès.

Puis, quand nous avons récupéré l'ID de processus, nous pouvons le tuer en utilisant taskkill sous Windows ou kill ou système Unix. Il s'agit d'un exemple de configuration de maven-antrun-plugin. Il déclare l'exécutable jps et redirige le résultat de son appel dans la propriété process.pid avec l'attribut <redirector>. Le résultat est filtré avec <outputfilterchain> de sorte que seules les lignes correspondant à l'exécutable AppServer sont conservées. jps sortie est sous la forme [PID] [NAME] de sorte que le nom est ensuite supprimé avec <replacestring>; De cette façon, nous gardons seulement le PID. Enfin, il existe deux configurations exec en fonction du système d'exploitation.

<configuration> 
    <target> 
     <property name="runtime_classpath" refid="maven.runtime.classpath" /> 
     <exec executable="java" spawn="true"> 
      <arg value="-classpath" /> 
      <arg value="${runtime_classpath}" /> 
      <arg value="somepackage.AppServer" /> 
     </exec> 
     <exec executable="${JAVA_HOME}/bin/jps"> 
      <arg value="-l" /> 
      <redirector outputproperty="process.pid"> 
       <outputfilterchain> 
        <linecontains> 
         <contains value="somepackage.AppServer" /> 
        </linecontains> 
        <replacestring from=" somepackage.AppServer" /> 
       </outputfilterchain> 
      </redirector> 
     </exec> 
     <exec executable="taskkill" osfamily="winnt"> 
      <arg value="/PID" /> 
      <arg value="${process.pid}" /> 
     </exec> 
     <exec executable="kill" osfamily="unix"> 
      <arg value="-15" /> 
      <arg value="${process.pid}" /> 
     </exec> 
    </target> 
</configuration> 

Puisque vous avez mentionné "gracieusement", j'ai utilisé l'option -15 sur Unix et n'a pas inclus l'option /F pour Windows. Si vous souhaitez forcer la sortie, vous pouvez utiliser kill -9 sur le système Unix et ajouter l'option /F sous Windows.

+0

Si cela fonctionne .. serait assez impressionnant .. Pouvez-vous confirmer que cela fonctionne avec vous? Je vais l'essayer maintenant :) – Gautam

+0

@Gautam Yep J'ai testé en lançant une classe Java qui a couru 'while (true);' et elle l'a tué correctement :). – Tunaki