使用NSSM在Windows 上运行 Java 服务

55 阅读2分钟

✅ JAR 后台运行
✅ 注册为 Windows 服务
✅ 指定 Java 版本
✅ 一键启动
脚本可重复执行,不会重复注册服务


✅ 最佳实践方案(强烈推荐)

👉 使用 NSSM(Non-Sucking Service Manager)

这是 Windows 上运行 Java 服务的事实标准
✔ 稳定
✔ 可控
✔ 运维友好
✔ 不需要改代码


一、准备工作

1️⃣ 下载 NSSM

D:\tools\nssm\

确保有:

D:\tools\nssm\nssm.exe

2️⃣ 确认 Java 路径

例如你要用 Java 17:

C:\Program Files\Java\jdk-17\bin\java.exe

3️⃣ JAR 位置示例

D:\app\park-office\
 ├─ app.jar
 ├─ logs\
 ├─ service-install.bat
 ├─ service-start.bat

二、核心:幂等的一键注册 + 启动脚本

重复执行不会重复注册服务


🔥 service-install.bat(重点)

@echo off
setlocal enabledelayedexpansion

REM ==========================
REM 基本配置
REM ==========================
set SERVICE_NAME=ParkOfficeService
set SERVICE_DISPLAY_NAME=Park Office System
set SERVICE_DESC=Park Office Spring Boot Service

set NSSM=D:\tools\nssm\nssm.exe
set JAVA_EXE=C:\Program Files\Java\jdk-17\bin\java.exe
set APP_HOME=D:\app\park-office
set JAR_NAME=app.jar

REM JVM 参数
set JVM_OPTS=-Xms512m -Xmx1024m -Dfile.encoding=UTF-8

REM ==========================
REM 判断服务是否已存在
REM ==========================
sc query "%SERVICE_NAME%" >nul 2>&1
if %ERRORLEVEL% EQU 0 (
    echo [INFO] 服务 "%SERVICE_NAME%" 已存在,跳过注册
    goto START_SERVICE
)

REM ==========================
REM 注册服务
REM ==========================
echo [INFO] 正在注册服务...

"%NSSM%" install "%SERVICE_NAME%" "%JAVA_EXE%" ^
    %JVM_OPTS% -jar "%APP_HOME%%JAR_NAME%"

"%NSSM%" set "%SERVICE_NAME%" AppDirectory "%APP_HOME%"
"%NSSM%" set "%SERVICE_NAME%" DisplayName "%SERVICE_DISPLAY_NAME%"
"%NSSM%" set "%SERVICE_NAME%" Description "%SERVICE_DESC%"

REM 日志重定向
"%NSSM%" set "%SERVICE_NAME%" AppStdout "%APP_HOME%\logs\stdout.log"
"%NSSM%" set "%SERVICE_NAME%" AppStderr "%APP_HOME%\logs\stderr.log"
"%NSSM%" set "%SERVICE_NAME%" AppRotateFiles 1
"%NSSM%" set "%SERVICE_NAME%" AppRotateOnline 1
"%NSSM%" set "%SERVICE_NAME%" AppRotateBytes 10485760

REM 开机自启
"%NSSM%" set "%SERVICE_NAME%" Start SERVICE_AUTO_START

echo [SUCCESS] 服务注册完成

:START_SERVICE
echo [INFO] 启动服务...
net start "%SERVICE_NAME%"

echo [SUCCESS] 操作完成
pause

✅ 脚本特性说明(重点)

可重复执行
✔ 服务存在 → 只启动
✔ 服务不存在 → 注册 + 启动
✔ Java 版本固定
✔ 日志自动滚动
✔ 开机自启


三、单独的一键启动 / 停止脚本(可选)

▶ service-start.bat

@echo off
net start ParkOfficeService
pause

⏹ service-stop.bat

@echo off
net stop ParkOfficeService
pause

四、如何验证是否成功?

1️⃣ 查看服务

services.msc

你会看到:

Park Office System


2️⃣ 查看日志

D:\app\park-office\logs\
 ├─ stdout.log
 └─ stderr.log

3️⃣ 查看 Java 版本是否正确

在 Spring Boot 启动日志里能看到:

Java version: 17

五、卸载服务(必要时)

net stop ParkOfficeService
D:\tools\nssm\nssm.exe remove ParkOfficeService confirm

六、为什么我强烈推荐 NSSM(而不是 sc create)?

方案评价
sc create❌ JVM 崩溃不重启
任务计划❌ 运维不直观
WinSW✅ 可用但复杂
NSSM⭐⭐⭐⭐⭐ Java 服务首选

七、结合你当前项目的建议(量身定制)

你现在的项目特点:

  • Spring Boot
  • Token / WeChat / MinIO
  • 长时间运行
  • 后台稳定性要求高

👉 NSSM 是最合适的