如何将.jar文件转为Windows服务并解决启动报错1053问题
Windows服务启动错误1053解决方案
错误根本原因
普通的Jar转EXE工具生成的可执行文件没有实现Windows服务的生命周期控制接口,Windows启动服务时会等待程序返回「启动成功」的状态通知,普通程序无法响应该请求,等待超时后就会抛出1053错误,和修改注册表的操作无关。
可行解决方案
推荐使用专门的Windows服务包装工具实现需求,以下两种方案均经过验证可用:
方案1:使用WinSW(Windows Service Wrapper,轻量易上手)
- 下载对应系统架构的WinSW可执行文件,重命名为
DataTransferService.exe,放到和你的webservice.jar(或webservice.exe)同目录下 - 同目录下创建同名配置文件
DataTransferService.xml,参考配置如下:
<service> <id>DataTransfer</id> <name>DataTransfer</name> <description>数据传输REST API服务</description> <!-- 如果用jar启动就配java路径,用exe启动就填exe的全路径 --> <executable>"C:\Program Files\Java\jdk1.8.0_xxx\bin\java.exe"</executable> <arguments>-jar "D:\web service\webservice.jar"</arguments> <startmode>Automatic</startmode> <logpath>D:\web service\logs</logpath> <log mode="roll-by-size"> <sizeThreshold>10240</sizeThreshold> <keepFiles>3</keepFiles> </log> </service>
- 以管理员身份打开CMD,进入该目录后执行安装命令:
DataTransferService.exe install
- 启动服务,不会再报1053错误:
net start DataTransfer
方案2:使用Apache Commons Daemon(Procrun,官方工具)
这是Apache官方提供的Java应用Windows服务封装工具,稳定性更高:
- 下载对应系统架构的
prunsrv.exe(服务端程序)和prunmgr.exe(图形化管理工具),放到指定目录 - 以管理员身份执行安装命令,参考示例:
prunsrv.exe //IS//DataTransfer ^ --DisplayName="DataTransfer Service" ^ --Install="C:\path\to\prunsrv.exe" ^ --Startup=auto ^ --Jvm="C:\Program Files\Java\jdk1.8.0_xxx\jre\bin\server\jvm.dll" ^ --Classpath="D:\web service\webservice.jar" ^ --StartMode=jvm ^ --StartClass=com.yourproject.YourMainClass ^ --StartMethod=main ^ --StopMode=jvm ^ --StopClass=com.yourproject.YourMainClass ^ --StopMethod=stop ^ --LogPath="D:\web service\logs"
- 安装完成后直接在服务管理器启动即可。
定时运行需求实现
根据你的业务场景二选一即可:
- 如果是常驻后台的REST服务,需要定时执行内部任务:直接在Java代码中使用
ScheduledExecutorService或者Spring框架的@Scheduled注解实现定时逻辑 - 如果是单次执行完就退出的任务类程序:不需要注册成服务,直接用Windows自带的「任务计划程序」配置触发周期和执行命令,实现成本更低。
常见排查点
- 确保服务运行账户(默认是Local System)拥有Jar/EXE所在目录、日志目录的读写权限
- 所有路径如果包含空格,必须用英文双引号包裹
- 启动失败优先查看包装工具生成的日志,可定位到Java启动报错、端口占用、依赖缺失等具体问题
内容的提问来源于stack exchange,提问作者Reshma R Gopal
相关产品推荐
相关产品推荐

