You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

无法将Jar文件作为Windows服务运行,启动报错Error 1053求助

解决Windows服务启动Error 1053的问题

这个错误的核心原因是:Windows服务要求目标程序必须遵循Windows服务控制协议——简单说,程序需要在启动后主动向Windows服务管理器发送"我已经启动成功"的信号,而你的.bat和普通Java程序都做不到这一点:

  • 你用start java -jar...会启动一个独立的Java进程,而bat本身的进程会立刻退出,服务管理器找不到正在运行的服务进程,就会判定超时。
  • 你的Java代码只是普通的控制台程序,没有和Windows服务管理器交互的逻辑,就算不用start,它也不会向服务管理器发送必要的状态信号。

下面给你几个可行的解决方案:

方案1:用NSSM(推荐,最简单)

NSSM是一个可以把任意程序包装成Windows服务的工具,不需要修改代码。步骤如下:

  1. 下载NSSM(搜索官方渠道获取对应版本),解压后把nssm.exe放到一个方便的路径,比如C:\tools
  2. 打开管理员命令提示符,切换到NSSM所在路径:cd C:\tools
  3. 运行命令创建服务:
    nssm install testservice
    
  4. 会弹出图形配置窗口:
    • 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标签,选择合适的登录账户(如果你的程序需要特定权限)
  5. 点击Install service完成安装,之后就可以从服务管理器启动testservice了。

方案2:修改Java代码为Windows服务兼容程序

如果你不想用第三方工具,可以让Java程序实现Windows服务的接口,这里推荐用Apache Commons Daemon库:

  1. 引入Apache Commons Daemon的依赖(比如在Maven里添加依赖,或者下载commons-daemon.jar放到classpath)。
  2. 修改你的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();
            }
        }
    }
    
  3. 用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
    
  4. 之后就可以正常启动服务了。

方案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

火山引擎 最新活动