当前位置: 首页 > 面试题库 >

优雅地停止由maven-antrun-plugin启动的Java进程

齐乐逸
2023-03-14
问题内容

,正如上面问题中回答的那样,我现在有一个maven-antrun-plugin,它可以分叉一个子进程并使用类似的配置来运行我的java
appserver-

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

上面的配置作为后台进程顺利启动了我的appserver。

现在,我的问题是,有没有一种简便的方法可以定位此过程并在构建完成后根据需要停止该过程。


问题答案:

您可以使用jpsJDK中捆绑的实用程序来获取正在运行的Java可执行文件的进程ID:

jps工具列出了目标系统上已检测到的HotSpot Java虚拟机(JVM)。该工具仅限于报告有关其具有访问权限的JVM的信息。

然后,当我们检索到进程ID时,可以taskkill在Windows kill或Unix系统上使用它来杀死它。

这将是的示例配置maven-antrun- plugin。它声明jps可执行文件,并在具有属性process.pid<redirector>属性中重定向其调用结果。用过滤结果,<outputfilterchain>以便仅AppServer保留与可执行文件相对应的行。jps输出的形式是[PID] [NAME]这样的名称,然后用除去<replacestring>;
这样,我们只保留PID。最后,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上使用了该选项,而在/FWindows上则未包括该选项。如果要强制退出,则可以kill -9在Unix系统上使用并/F在Windows上添加该选项。



 类似资料:
  • 问题内容: 如何在Linux和Windows中正常停止Java进程? 什么时候被调用,什么时候不被调用? 终结器又如何呢? 我可以从外壳向Java进程发送某种信号吗? 我正在寻找最好的便携式解决方案。 问题答案: 在所有未强制终止VM的情况下,都会执行关机挂钩。因此,如果要发出“标准” kill(通过kill命令),则它们将执行。同样,它们将在调用后执行。 但是强行杀死(或),然后它们将不会执行。

  • 问题内容: 我写了一个线程,它花费太多时间执行,而且似乎还没有完全完成。我想优雅地停止线程。有什么帮助吗? 问题答案: 做到这一点的好方法是让一个线程保护一个Thread的变量,并在你要停止它的时候将其设置为外部变量,例如: `class MyThread extends Thread { volatile boolean finished = false; public void stopMe(

  • 不论是什么类型的应用,都会希望在服务停止前能够收到停止通知,有一定的时间做退出前的释放资源、关闭连接、不再接收外部请求等工作。我们对所有应用的优雅停止配置提供了一个全面指导,也提供了每种类型服务,从开发到部署到应用引擎v2的测试优雅停止功能的完整流程。 容器优雅停止最简单办法 当退出容器前,会将容器从服务提供列表中移除,使得外部请求不再打在其上,同时执行退出前可执行Hook。 在这里,我们设置在停

  • 我在eclipse(java main method program)中运行一个脚本,它创建线程,每个线程处理一个excel表,然后将处理后的数据保存到数据库中。它已经处理数据2天了,今天突然我从excel处理完每条记录后打印的日志停止了。 我的代码的编写方式是,在处理完一个完整的工作表后,它将一条状态消息写入excel工作表记录中。这部分代码是在finally块中编写的。我一直在等待程序自行终止

  • 今天我遇到错误。 分析表明,最近的GC根是Logback thread: 即: 在中保存修改后,Tomcat8收到通知(我不确定用于监视fs上的更改的API是什么),然后开始重新部署应用程序。这就是之前发生的情况。 如何在容器环境中优雅地停止登录? 如何停止线程? null 更新我在中玩堆转储。在从坏的线程的引用跳转级别下: 它指的是 通过插入的日志源,我找到了changelog条目:

  • 主要内容:一、 将应用整合Spring ,二、 添加钩子函数优雅管理服务一、 将应用整合Spring       1. 扫描包         使用AnnotationConfigApplicationContext类应用包,指定包的根路径即可,该类会加载并扫描所有Spring容器应该扫描的被指定注解标记类, 比如被@Component、@Configuration注解标记的类。       包的路径需要保证正确,否则在扫描注解的时候会出现找不到的情况,因为后续需要借