用Java启动Windows服务

用Java启动Windows服务,java,windows-services,Java,Windows Services,我正试图用这个启动java中的windows服务 public static void main(String[] args) throws IOException { String startCom = "net start"; String startProc = "\"C:/Program Files/Common Files/Apple/Mobile Device Support/bin/AppleMobileDeviceService.exe\"";

我正试图用这个启动java中的windows服务

public static void main(String[] args) throws IOException {
        String startCom = "net start";
        String startProc = "\"C:/Program Files/Common Files/Apple/Mobile Device Support/bin/AppleMobileDeviceService.exe\"";
        Runtime rt = Runtime.getRuntime();
        Process proc = rt.exec(startCom + startProc);       
        System.out.println("Starting It");

}
它运行时没有异常,但不会启动服务。我做错了什么

  • 尝试弄清楚注册的服务名称是什么,并使用它而不是完整的可执行文件。例如:

    net start“Adobe Acrobat更新服务”

    您可以通过在命令窗口(打印所有已注册服务的列表)上运行
    net start
    或通过单击开始按钮,键入
    services.msc
    并按Enter键在服务控制面板中查找服务来查找服务名。如果服务名称不明确,可以在“服务”控制面板中右键单击该服务,然后单击“属性”以确认该服务的可执行文件

  • 您可能需要以升级权限执行该命令。您可以通过禁用UAC(不推荐)、在启动程序时以提升的权限启动javaw.exe或使用类似于执行任何特权命令的实用程序来实现这一点

  • 如果您无法让Runtime.exec执行您的命令,请尝试使用

  • 最后,最好始终读取STDOUT和STDERR的内容(从
    Process.getOutputStream()
    Process.getErrorStream()
    )。它们可能包含诊断信息;但更重要的是,如果缓冲区在
    进程
    仍向其输出时填满,则
    进程
    将挂起

  • 请尝试以下代码:

    public static void main(String[] args) throws IOException {
    
        Runtime rt = Runtime.getRuntime();
        Process proc = rt.exec("cmd start /c C:/Program Files/Common Files/Apple/Mobile Device Support/bin/AppleMobileDeviceService.exe");       
        System.out.println("Starting It");
    
    看起来您的main()已退出,因此您的服务将终止。在这种情况下,您需要使用

    sc create "servicename" binpath="path", 
    
    然后从

    sc start "servicename.
    

    也就是说,service.exe仍然需要作为Windows服务安装。

    您是否尝试使用proc.getOutputStream和proc.getErrorStream?@skaffman:Java服务包装器允许您启动现有的Windows服务?我似乎在它的.Read列表中找不到。如果使用Runtime.exec()方法签名,请确保在“start”和服务名称之间包含空格。如果使用其他方法签名之一,则可执行文件名将为
    net
    ,参数将为
    start
    和服务名。大家好:感谢帮助,仍然不起作用,我尝试了net start,但命令行中的名称表示其无效名称,正在查找可执行文件(也不起作用)。我想这就剩下processbuilder了?getErrorStream返回java.io。FileInputStream@21b6d,仍在尝试查找…直接在命令行上运行
    net start SERVICENAME
    是否会遇到相同的错误?关于您提到的最后一个错误,您将无法直接将其作为字符串使用——您将希望像从FileInputStream或其他InputStream读取时一样读取错误流的内容:您好,Rob,是的,它说的是无效名称,因此我切换回使用此进程proc=rt.exec(“net start\”C:/Program Files/Common Files/Apple/Mobile Device Support/bin/AppleMobileDeviceService.exe\“”);发生了系统错误123。文件名、目录名或卷标语法不正确。这一定与我如何转义到服务的路径有关,但到目前为止还没有任何效果……请记住,Windows对路径不使用
    /
    ,而是使用\(您必须以Java字符串文字转义)。
    net start“C:\Program Files\Common Files\Apple\Mobile Device Support\bin\AppleMobileDeviceService.exe”
    是否在命令行上工作?首先确保可以在命令行上运行该命令,然后让Java执行相同的命令。