是否应将带Web UI的Java程序部署为Windows服务?求原因与实现方法
绝对应该把你的Java应用部署成Windows服务,尤其是当它以服务器模式运行、提供浏览器UI的时候。下面我给你拆解原因和具体实现步骤:
是否应该部署为Windows服务?
答案是肯定的,尤其是对于需要长期稳定运行的服务器端应用来说,Windows服务比批处理启动的方式优势太多了。
核心原因
- 开机自动恢复:如果服务器因为系统更新、意外断电等原因重启,服务会自动启动,不用你手动去找到批处理文件再运行,保证服务的持续可用性。
- 后台无干扰运行:服务是在系统后台运行的,不会占用一个命令行窗口,再也不用担心不小心关掉窗口导致服务中断的问题。
- 更稳定的运行环境:可以给服务配置专门的运行账户(比如低权限账户,提升安全性),而且Windows服务管理器可以监控进程,万一应用崩溃,还能配置自动重启策略,比批处理的容错性强得多。
- 统一运维管理:可以通过Windows自带的服务控制台(
services.msc)、sc命令或者PowerShell来启停服务、查看运行状态,和系统其他服务统一管理,运维起来更规范。
具体实现方法
下面给你介绍三种常用的方案,你可以根据自己的需求选择:
方法1:Apache Commons Daemon(Procrun)
这是Java生态里最成熟的将程序包装成Windows服务的工具,功能强大且灵活。
- 下载Procrun的二进制包,找到
prunsrv.exe和prunmgr.exe两个文件,把它们重命名为和你的应用相关的名字(比如MyJavaServer.exe和MyJavaServerw.exe,后缀w代表图形化管理工具)。 - 编写一个批处理脚本用来安装服务,示例如下(记得替换成你自己的路径和参数):
@echo off set SERVICE_NAME=MyJavaServer set PR_INSTALL=C:\your-app-path\MyJavaServer.exe REM 配置Java环境和应用参数 set PR_JVM=C:\Program Files\Java\jdk1.8.0_301\jre\bin\server\jvm.dll set PR_CLASSPATH=C:\your-app-path\your-app.jar;C:\your-app-path\lib\*.jar set PR_STARTUP=auto set PR_STARTMODE=jvm set PR_STARTCLASS=com.yourcompany.ServerMain set PR_STARTMETHOD=main set PR_STOPMODE=jvm set PR_STOPCLASS=com.yourcompany.ServerMain set PR_STOPMETHOD=stop set PR_STOPPARAMS=shutdown set PR_LOGPATH=C:\your-app-path\logs set PR_STDOUTPUT=auto set PR_STDERROR=auto REM 执行安装命令 %PR_INSTALL% //IS//%SERVICE_NAME% ^ --DisplayName="My Java Server" ^ --Description="Java Server with Spark & Embedded Jetty" ^ --Install="%PR_INSTALL%" ^ --Jvm="%PR_JVM%" ^ --Classpath="%PR_CLASSPATH%" ^ --Startup="%PR_STARTUP%" ^ --StartMode="%PR_STARTMODE%" ^ --StartClass="%PR_STARTCLASS%" ^ --StartMethod="%PR_STARTMETHOD%" ^ --StopMode="%PR_STOPMODE%" ^ --StopClass="%PR_STOPCLASS%" ^ --StopMethod="%PR_STOPMETHOD%" ^ --StopParams="%PR_STOPPARAMS%" ^ --LogPath="%PR_LOGPATH%" ^ --StdOutput="%PR_STDOUTPUT%" ^ --StdError="%PR_STDERROR%" echo 服务安装成功! pause
- 右键点击这个批处理文件,选择「以管理员身份运行」,完成服务安装。之后你可以在
services.msc里找到并管理这个服务。 - 卸载服务的话,在命令行运行:
MyJavaServer.exe //DS//MyJavaServer
注意:你的主类需要实现优雅停机的逻辑,比如在
stop方法里关闭Spark和Jetty服务器,这样服务停止时会正常释放资源,而不是被强制杀掉进程。
方法2:NSSM(Non-Sucking Service Manager)
这个工具以简单易用著称,不需要复杂的配置,适合快速把任意程序包装成Windows服务。
- 下载NSSM工具,解压后把
nssm.exe放到应用目录或者系统环境变量路径里。 - 以管理员身份打开命令提示符,运行
nssm install MyJavaServer,会弹出一个图形化配置窗口。 - 在「Application」标签页:
Path:选择你的java.exe路径(比如C:\Program Files\Java\jdk1.8.0_301\bin\java.exe)Arguments:填写启动参数,比如-jar C:\your-app-path\your-app.jarWorking Directory:选择你的应用所在目录
- 切换到「Details」标签页,设置服务的显示名称和描述;「Recovery」标签页可以配置应用崩溃后的重启策略(比如失败后自动重启)。
- 点击「Install service」完成安装,之后就能在
services.msc里启停、管理这个服务了。
卸载服务的话,运行nssm remove MyJavaServer,按提示确认即可。
方法3:Java自带的jpackage(Java 16+)
如果你的Java版本是16及以上,可以直接用jpackage工具生成包含Windows服务的安装包,一步到位,适合需要分发应用的场景。
示例命令(同样替换成你的路径和参数):
jpackage ^ --type exe ^ --name MyJavaServer ^ --input C:\your-app-path\libs ^ --main-jar your-app.jar ^ --main-class com.yourcompany.ServerMain ^ --win-service ^ --win-service-name "MyJavaServer" ^ --win-service-display-name "My Java Server" ^ --win-service-description "Java Server with Spark and Embedded Jetty"
执行这个命令后,会生成一个exe安装文件,用户安装后会自动注册成Windows服务,非常方便。
内容的提问来源于stack exchange,提问作者Paul Taylor
相关产品推荐
相关产品推荐

