✅ JAR 后台运行
✅ 注册为 Windows 服务
✅ 指定 Java 版本
✅ 一键启动
✅ 脚本可重复执行,不会重复注册服务
✅ 最佳实践方案(强烈推荐)
👉 使用 NSSM(Non-Sucking Service Manager)
这是 Windows 上运行 Java 服务的事实标准
✔ 稳定
✔ 可控
✔ 运维友好
✔ 不需要改代码
一、准备工作
1️⃣ 下载 NSSM
- 官网:nssm.cc/download
- 解压后,比如放到:
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 是最合适的