在 Windows Server 上部署 Java 服务(即 Java 应用程序作为后台服务运行)通常包括以下几个步骤。以下是一个完整的指南,适用于将 Spring Boot、Java Web 应用或其他 Java 程序部署为 Windows 服务。
✅ 一、准备工作
-
安装 Java 运行环境(JRE 或 JDK)
- 下载并安装 JDK 或 JRE(推荐使用 Oracle JDK、OpenJDK 等)。
- 设置环境变量:
JAVA_HOME
:指向 JDK 安装目录,例如C:Program FilesJavajdk-17
- 将
%JAVA_HOME%bin
添加到PATH
环境变量中。
- 验证安装:
java -version
-
准备好你的 Java 应用
- 通常是一个打包好的
.jar
文件(如myapp.jar
)。 - 确保可以在命令行运行:
java -jar myapp.jar
测试应用是否能正常启动。
- 通常是一个打包好的
✅ 二、将 Java 应用部署为 Windows 服务
由于 Windows 本身不支持直接将 .jar
文件作为服务运行,我们需要借助工具来实现。常用工具有:
方案 1:使用 NSSM(Non-Sucking Service Manager)——推荐 ✅
NSSM 是一个简单、免费、开源的工具,可将任意可执行文件包装为 Windows 服务。
步骤:
-
下载 NSSM
- 官网:https://nssm.cc/download
- 下载
nssm-2.24.zip
(或其他版本),解压到目录,例如:C:nssm
-
运行 NSSM GUI 工具
- 打开命令提示符或资源管理器,进入
win64
目录:cd C:nssmwin64 nssm.exe install MyJavaApp
MyJavaApp
是你为服务起的名字。
- 打开命令提示符或资源管理器,进入
-
配置服务参数
在弹出的窗口中填写:- Path:
C:Program FilesJavajdk-17binjava.exe
(Java 可执行文件路径) - Arguments:
-jar "C:myappmyapp.jar"
(注意路径用引号包围) - Startup directory:
C:myapp
(jar 所在目录,避免路径问题)
其他选项可保持默认。
- Path:
-
安装并启动服务
- 点击 “Install service”
- 打开“服务”管理器(
services.msc
),找到MyJavaApp
,右键启动。 - 或使用命令行:
net start MyJavaApp
-
设置开机自启
- 在服务属性中将“启动类型”设置为“自动”。
-
查看日志(可选)
- 在 NSSM 配置中设置“I/O”选项,将输出重定向到日志文件:
- Output (stdout):
C:myapplogsstdout.log
- Error (stderr):
C:myapplogsstderr.log
- Output (stdout):
- 在 NSSM 配置中设置“I/O”选项,将输出重定向到日志文件:
方案 2:使用 Apache Commons Daemon(procrun)
适用于更高级控制,适合生产环境。
-
下载
procrun
(来自 Apache Commons Daemon):- https://commons.apache.org/proper/commons-daemon/
-
准备两个可执行文件:
prunsrv.exe
(服务运行器,32/64位)- 放在你的应用目录,如
C:myappprunsrv.exe
-
创建启动脚本
install_service.bat
:@echo off set SERVICE_NAME=MyJavaApp set PRUNSRV=C:myappprunsrv.exe set APP_JAR=C:myappmyapp.jar set JAVA_HOME=C:Program FilesJavajdk-17 %PRUNSRV% //IS//%SERVICE_NAME% ^ --DisplayName="My Java Application" ^ --Description="My Spring Boot Application" ^ --Startup=auto ^ --Install="%PRUNSRV%" ^ --Jvm="%JAVA_HOME%binserverjvm.dll" ^ --StartMode=jvm ^ --StopMode=jvm ^ --StartClass=org.springframework.boot.loader.JarLauncher ^ --StartPath="%APP_JAR%" ^ --StartParams="-jar#%APP_JAR%" ^ --StopClass=org.springframework.boot.loader.JarLauncher ^ --StopParams="stop" ^ --LogPath=C:myapplogs ^ --LogLevel=Debug echo Service installed. pause
-
运行脚本安装服务,然后通过
services.msc
启动。
⚠️ 注意:
--StartClass
要根据你的 jar 启动类调整,Spring Boot 通常是org.springframework.boot.loader.JarLauncher
(对于可执行 jar)。
✅ 三、常见问题与建议
问题 | 解决方案 |
---|---|
服务启动后立即停止 | 检查日志,常见原因是路径错误、Java 未找到、jar 启动类错误 |
中文乱码 | 在启动参数中添加:-Dfile.encoding=UTF-8 |
内存不足 | 添加 JVM 参数:-Xms512m -Xmx2g |
需要配置文件 | 确保 application.properties 在 jar 同目录或 classpath 中 |
✅ 四、监控与维护
- 使用 Windows 事件查看器或日志文件排查问题。
- 使用 PowerShell 或 CMD 管理服务:
net start MyJavaApp net stop MyJavaApp sc delete MyJavaApp // 卸载服务
- 建议配合日志框架(如 Logback)输出到文件。
✅ 总结
方案 | 优点 | 推荐场景 |
---|---|---|
NSSM | 简单易用,图形化配置 | 快速部署、测试环境 |
Procrun | 更强大,支持 JVM 级控制 | 生产环境、需要精细控制 |
如你使用的是 Spring Boot,还可以考虑:
- 打成可执行 jar(
spring-boot-maven-plugin
) - 使用
java -jar
直接运行,配合 NSSM 部署为服务。
如果你提供具体的应用类型(如 Spring Boot、普通 Java 程序等),我可以给出更精确的配置示例。