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

是否应将带Web UI的Java程序部署为Windows服务?求原因与实现方法

绝对应该把你的Java应用部署成Windows服务,尤其是当它以服务器模式运行、提供浏览器UI的时候。下面我给你拆解原因和具体实现步骤:

是否应该部署为Windows服务?

答案是肯定的,尤其是对于需要长期稳定运行的服务器端应用来说,Windows服务比批处理启动的方式优势太多了。

核心原因

  • 开机自动恢复:如果服务器因为系统更新、意外断电等原因重启,服务会自动启动,不用你手动去找到批处理文件再运行,保证服务的持续可用性。
  • 后台无干扰运行:服务是在系统后台运行的,不会占用一个命令行窗口,再也不用担心不小心关掉窗口导致服务中断的问题。
  • 更稳定的运行环境:可以给服务配置专门的运行账户(比如低权限账户,提升安全性),而且Windows服务管理器可以监控进程,万一应用崩溃,还能配置自动重启策略,比批处理的容错性强得多。
  • 统一运维管理:可以通过Windows自带的服务控制台(services.msc)、sc命令或者PowerShell来启停服务、查看运行状态,和系统其他服务统一管理,运维起来更规范。

具体实现方法

下面给你介绍三种常用的方案,你可以根据自己的需求选择:

方法1:Apache Commons Daemon(Procrun)

这是Java生态里最成熟的将程序包装成Windows服务的工具,功能强大且灵活。

  1. 下载Procrun的二进制包,找到prunsrv.exe和prunmgr.exe两个文件,把它们重命名为和你的应用相关的名字(比如MyJavaServer.exe和MyJavaServerw.exe,后缀w代表图形化管理工具)。
  2. 编写一个批处理脚本用来安装服务,示例如下(记得替换成你自己的路径和参数):
@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
  1. 右键点击这个批处理文件,选择「以管理员身份运行」,完成服务安装。之后你可以在services.msc里找到并管理这个服务。
  2. 卸载服务的话,在命令行运行:MyJavaServer.exe //DS//MyJavaServer

注意:你的主类需要实现优雅停机的逻辑,比如在stop方法里关闭Spark和Jetty服务器,这样服务停止时会正常释放资源,而不是被强制杀掉进程。

方法2:NSSM(Non-Sucking Service Manager)

这个工具以简单易用著称,不需要复杂的配置,适合快速把任意程序包装成Windows服务。

  1. 下载NSSM工具,解压后把nssm.exe放到应用目录或者系统环境变量路径里。
  2. 以管理员身份打开命令提示符,运行nssm install MyJavaServer,会弹出一个图形化配置窗口。
  3. 在「Application」标签页:
    • Path:选择你的java.exe路径(比如C:\Program Files\Java\jdk1.8.0_301\bin\java.exe)
    • Arguments:填写启动参数,比如-jar C:\your-app-path\your-app.jar
    • Working Directory:选择你的应用所在目录
  4. 切换到「Details」标签页,设置服务的显示名称和描述;「Recovery」标签页可以配置应用崩溃后的重启策略(比如失败后自动重启)。
  5. 点击「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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:28:07