无法将Jar文件作为Windows服务运行,启动报错Error 1053求助
解决Windows服务启动Error 1053的问题
这个错误的核心原因是:Windows服务要求目标程序必须遵循Windows服务控制协议——简单说,程序需要在启动后主动向Windows服务管理器发送"我已经启动成功"的信号,而你的.bat和普通Java程序都做不到这一点:
- 你用
start java -jar...会启动一个独立的Java进程,而bat本身的进程会立刻退出,服务管理器找不到正在运行的服务进程,就会判定超时。 - 你的Java代码只是普通的控制台程序,没有和Windows服务管理器交互的逻辑,就算不用start,它也不会向服务管理器发送必要的状态信号。
下面给你几个可行的解决方案:
方案1:用NSSM(推荐,最简单)
NSSM是一个可以把任意程序包装成Windows服务的工具,不需要修改代码。步骤如下:
- 下载NSSM(搜索官方渠道获取对应版本),解压后把
nssm.exe放到一个方便的路径,比如C:\tools。 - 打开管理员命令提示符,切换到NSSM所在路径:
cd C:\tools。 - 运行命令创建服务:
nssm install testservice - 会弹出图形配置窗口:
- Path:选择你的Java可执行文件路径,比如
C:\Program Files\Java\jdk1.8.0_301\bin\java.exe - Arguments:填
-jar C:\Users\Karthikeyan\Desktop\TestingJar.jar - Working Directory:可以填jar文件所在的目录
C:\Users\Karthikeyan\Desktop - 切换到Details标签,设置Display name为
MyService - 切换到Log On标签,选择合适的登录账户(如果你的程序需要特定权限)
- Path:选择你的Java可执行文件路径,比如
- 点击Install service完成安装,之后就可以从服务管理器启动
testservice了。
方案2:修改Java代码为Windows服务兼容程序
如果你不想用第三方工具,可以让Java程序实现Windows服务的接口,这里推荐用Apache Commons Daemon库:
- 引入Apache Commons Daemon的依赖(比如在Maven里添加依赖,或者下载
commons-daemon.jar放到classpath)。 - 修改你的Java代码,实现Daemon接口:
import org.apache.commons.daemon.Daemon; import org.apache.commons.daemon.DaemonContext; import org.apache.commons.daemon.DaemonInitException; public class TestJarClass implements Daemon { @Override public void init(DaemonContext context) throws DaemonInitException { // 初始化逻辑,比如加载配置 } @Override public void start() throws Exception { System.out.println("Service Started...."); // 这里可以写服务的核心逻辑,比如启动一个线程保持程序运行 Thread.sleep(Long.MAX_VALUE); // 防止程序退出 } @Override public void stop() throws Exception { System.out.println("Service Stopped...."); // 停止逻辑 } @Override public void destroy() { // 销毁资源 } public static void main(String[] args) { // 控制台运行的入口 TestJarClass service = new TestJarClass(); try { service.start(); } catch (Exception e) { e.printStackTrace(); } } } - 用Apache Commons Daemon的
prunsrv.exe工具把jar注册成服务:prunsrv.exe //IS//testservice --DisplayName="MyService" --Classpath=C:\Users\Karthikeyan\Desktop\TestingJar.jar;C:\path\to\commons-daemon.jar --StartClass=TestJarClass --StartMethod=start --StopClass=TestJarClass --StopMethod=stop --StartMode=jvm --StopMode=jvm - 之后就可以正常启动服务了。
方案3:修改.bat文件(不推荐,仅临时测试)
如果你只是临时测试,不想改代码或用工具,可以修改bat去掉start命令,并且让Java程序保持运行(否则程序执行完就退出,服务还是会报错):
@ECHO OFF java -jar C:\Users\Karthikeyan\Desktop\TestingJar.jar
然后修改Java代码,让程序一直运行:
public class TestJarClass { public static void main(String args[]) { System.out.println("Service Started...."); try { Thread.sleep(Long.MAX_VALUE); // 让程序一直挂着 } catch (InterruptedException e) { e.printStackTrace(); } } }
但这种方法还是不标准,因为程序依然没有和服务管理器交互,可能会出现其他问题,比如无法正常停止服务,所以只适合临时测试。
内容的提问来源于stack exchange,提问作者Karthikeyan




