2016-02-17 3 views
2

Этот вопрос является результатом ответа на этот вопрос вчераИзящно остановка процесса Java, начатую Maven-antrun-плагин

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

Итак, как ответил на поставленный выше вопрос у меня теперь есть maven- antrun-плагин, который порождает дочерний процесс и запускает свой Java сервер приложений с использованием конфигурации, как это -

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

Вышеуказанная конфигурация плавно начинает свой сервер приложений в качестве фонового процесса.

Теперь мой вопрос: если есть простой способ, я могу найти этот процесс и остановить его, если мне нужно, после того как я начну его через свою сборку.

ответ

3

Вы можете использовать jps утилиты, устанавливающую внутри JDK, чтобы получить идентификатор процесса запущенного Java исполняемого:

Инструмент jps перечисляет инструментальный HotSpot Java Virtual Machines (JVMs) на целевой системе , Инструмент ограничен информацией о представлении информации о JVM, для которой он имеет права доступа.

Затем, когда мы восстановили идентификатор процесса, мы можем убить его с помощью taskkill на Windows, или kill или системы Unix.

Это будет образец конфигурации maven-antrun-plugin. Он объявляет исполняемый файл и перенаправляет результат его вызова в свойстве process.pid с атрибутом <redirector>. Результат фильтруется с помощью <outputfilterchain>, так что сохраняются только строки, соответствующие исполняемому файлу AppServer. jps вывод находится в форме [PID] [NAME], поэтому имя затем удаляется <replacestring>; таким образом, мы сохраняем только ПИД. Наконец, в зависимости от ОС есть две конфигурации exec.

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

Поскольку вы упомянули «изящно», я использовал -15 вариант на Unix и не включают /F вариант для Windows. Если вы хотите принудительно выйти, вы можете использовать kill -9 в системе Unix и добавить опцию /F в Windows.

+0

Если это сработает .. было бы весьма впечатляюще. Можете ли вы подтвердить, что он работает с вами? Я собираюсь попробовать сейчас :) – Gautam

+0

@Gautam Yep Я тестировал запуск Java-класса, который запускал 'while (true);' и он правильно его убил :). – Tunaki

Смежные вопросы