Linux 下 nohup & 一行搞定後台服務,Windows 卻常讓人折騰半天。本文記錄將 Java 應用註冊為 Windows 系統服務的完整實踐,採用 Apache Commons Daemon Procrun (prunsrv),參考 Tomcat 同款方案,穩定、免費、支援 64 位。
prunmgr.exe,可視化調參。commons-daemon-1.0.8-bin-windows.zip(新版同理)。amd64 目錄(64 位關鍵),複製:
prunsrv.exe —— 服務運行核心prunmgr.exe —— 管理監控工具(建議重命名為 YourApp.exe)D:\myapp\service)。install-service.bat@echo off
set APP_HOME=D:\myapp\service
set JAVA_HOME=C:\Java\jdk1.8.0_301
set LIB_HOME=D:\myapp\lib
%APP_HOME%\prunsrv.exe //IS//MyAppService ^
--DisplayName="My Application Service" ^
--Description="Java Application as Windows Service" ^
--Install=%APP_HOME%\prunsrv.exe ^
--Jvm=%JAVA_HOME%\jre\bin\server\jvm.dll ^
--JvmMs=256 --JvmMx=1024 ^
--StartMode=jvm --Startup=auto --StopMode=jvm ^
--Classpath=%LIB_HOME%\*;%APP_HOME%\app.jar ^
--StartClass=com.myapp.Main ^
--StartParams=arg1;arg2 ^
--LogPath=%APP_HOME%\logs ^
--LogPrefix=myapp-service ^
--LogLevel=Info ^
--StdOutput=auto --StdError=auto
關鍵參數解析:
//IS//MyAppService:安裝服務,名稱唯一標識。--Jvm:指定 jvm.dll 路徑(必須用 server 版,性能更優)。--JvmMs/--JvmMx:初始/最大堆內存(MB)。--StartMode=jvm:進程內啟動 JVM(非新進程),性能最佳。--Classpath:通配符 \* 僅支援 Java 6+,建議顯式列出關鍵 JAR。--Install:必須包含完整路徑 %APP_HOME%\prunsrv.exe,否則報「找不到文件」。uninstall-service.bat@echo off
set APP_HOME=D:\myapp\service
%APP_HOME%\prunsrv.exe //DS//MyAppService
install-service.bat。services.msc),尋找 "My Application Service",狀態應為「運行中」。prunmgr.exe //MS//MyAppService(或重命名後的 YourApp.exe)啟動 GUI 管理器,可熱修改 JVM 參數、日誌路徑等。| 現象 | 原因 | 修正 |
|---|---|---|
| 服務啟動即停止 | Main 類非 public static void main / 拋出未捕獲異常 | 檢查啟動類簽名,增加 try-catch 並記錄日誌 |
| ClassNotFoundException | Classpath 路徑錯誤或缺少依賴 JAR | 使用絕對路徑,確認通配符生效(Java 6+) |
| 內存參數不生效 | 未指定 --Jvm 導致用默認 client jvm | 強制指定 --Jvm=%JAVA_HOME%\jre\bin\server\jvm.dll |
| 日志不輸出 | --LogPath 目錄不存在或無寫入權限 | 預建目錄,授予服務用戶寫入權限 |
Procrun --StopMode=jvm 會調用 System.exit(0),建議在應用註冊 ShutdownHook:
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
// 關閉數據庫連接池、釋放資源、flush 日誌
logger.info("Service shutting down gracefully...");
}));
Apache Commons Daemon Procrun 官方文檔 —— 所有參數權威說明在此。
一次配置,長期受益。用 Procrun 將 Java 應用變身原生 Windows 服務,告別 CMD 窗口常駐,擁抱生產級部署標準。