You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot jar注册为Windows服务后停止服务java进程残留如何解决

解决方案

问题根因

你当前配置的StartMode=exe是让prunsrv单独启动独立的java.exe子进程,prunsrv默认没有绑定子进程的生命周期,且配置的java模式停止逻辑没有正确触发SpringBoot进程退出,才会出现java进程残留。

修复方案

方案1(更推荐:完全避免独立java进程)

改用prunsrv的JVM模式运行,直接将JVM加载到prunsrv进程内部,不会额外生成独立java.exe进程,从根源解决残留问题。修改后配置如下:

set "CLASSPATH=D:\temp-1.0.0.jar"

prunsrv.exe //IS//%SERVICE_NAME% ^
    --Description "Myservice" ^
    --DisplayName "%DISPLAYNAME%" ^
    --Install "%EXECUTABLE%" ^
    --LogPath "D:\MyService" ^
    --Startup auto ^
    --StdOutput auto ^
    --StdError auto ^
    --Classpath "%CLASSPATH%" ^
    --Jvm "%JVM%" ^
    --StartMethod main ^
    --StopMethod stop ^
    --StartMode jvm ^
    --StopMode jvm ^
    --StartPath "D:\MyService" ^
    --StopPath "D:\MyService" ^
    --StartClass com.darth.MyService ^
    --StopClass com.darth.MyService ^
    --StopParams stop ^
    --JvmMs 1024 ^
    --JvmMx 6144 ^
    --StopTimeout 30

同时需要在你的com.darth.MyService启动类中补充静态stop方法,实现SpringBoot优雅退出:

package com.darth;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class MyService {
    private static ConfigurableApplicationContext context;

    public static void main(String[] args) {
        context = SpringApplication.run(MyService.class, args);
    }

    // 新增stop方法供prunsrv调用
    public static void stop() {
        SpringApplication.exit(context, () -> 0);
    }
}

方案2(保留exe启动模式,强制杀残留进程)

如果需要保留独立java.exe启动的方式,修改停止配置让prunsrv停止时自动杀掉关联java进程:

set "CLASSPATH=D:\temp-1.0.0.jar"

prunsrv.exe //IS//%SERVICE_NAME% ^
    --Description "Myservice" ^
    --DisplayName "%DISPLAYNAME%" ^
    --Install "%EXECUTABLE%" ^
    --LogPath "D:\MyService" ^
    --Startup auto ^
    --StdOutput auto ^
    --StdError auto ^
    --Classpath "%CLASSPATH%" ^
    --Jvm "%JVM%" ^
    --StartImage "%JAVA_HOME%\bin\java.exe" ^
    --StartMethod main ^
    --StartMode exe ^
    --StopMode exe ^
    --StartPath "D:\MyService" ^
    --StopPath "D:\MyService" ^
    --StartClass com.darth.MyService ^
    --StopImage "C:\Windows\System32\taskkill.exe" ^
    --StopParams "/f#/im#java.exe#/fi#COMMANDLINE eq *temp-1.0.0.jar*" ^
    --StartParams -jar#%CLASSPATH% ^
    --JvmMs 1024 ^
    --JvmMx 6144 ^
    --StopTimeout 10

该方案的StopParams会匹配命令行包含temp-1.0.0.jar的java进程强制杀掉,不会误杀其他Java服务。

内容的提问来源于stack exchange,提问作者Darth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 17:15:02