2

用一个简单的程序测试 nssm:

import javax.swing.JOptionPane;

// a simple program to test if i can get nssm to work
public class Test {

    public static void main(String[]args) throws InterruptedException {
        while(true) {
            JOptionPane.showMessageDialog(null, "Test");
            Thread.sleep(5000);
        }
    }
}

我从上述程序中创建了一个 jar 文件,将 nssm 添加到 PATH 并使用以下内容从中创建服务:

C:\Users\ProgrammerSausage>nssm install servicetest "C:\ProgramFiles\Java\jre1.8.0_162\bin\java.exe" "-jar C:\Users\ProgrammerSausage\Documents\serviceTest.jar"

Administrator access is needed to install a service.

我输入了我的密码——它似乎奏效了。检查任务管理器服务,它在那里,但“停止”,我启用以查看可能发生的情况,说它正在运行。但什么都没有。我究竟做错了什么?

编辑:

我已将控制台更改为管理员。创建了一个 .bat (它自己工作):

@echo off
java -jar C:\Users\ProgrammerSausage\Documents\serviceTest.jar

但是,如果我尝试使用 NSSM 安装批处理文件,它仍然只是打开一个幻像服务,除了说它正在运行之外什么都不做。

C:\Windows\system32>nssm install servicetestfour "C:\Users\ProgrammerSausage\Documents\serviceTest.bat"

Service "servicetestfour" installed successfully!

我发现有趣的是,我可以创建任何目录的幻像服务,例如:

C:\Windows\system32>nssm install servicetestfive "C:\Users\ProgrammerSausage\"

Service "servicetestfive" installed successfully!

呃什么?然而,主要区别在于从随机目录创建的服务不会启动。因此,这表明它可以运行批处理和 jar 文件,但我没有看到 JOptionPane 弹出窗口?

编辑:

好的,所以我更改了程序的代码,因为正如建议的那样,它可能不允许显示 gui,包括一个简单的 io 调用:

public static void main(String[]args) throws InterruptedException {
    File f = new File("C:\\Users\\ProgrammerSausage\\Documents\\test");
    while(true) {
        if(!f.exists()) {
            f.mkdir();
        }
        JOptionPane.showMessageDialog(null, "Test");
        Thread.sleep(5000);
    }
}

这很有趣,因为虽然我启用了

'Allow service to interact with desktop'

JOptionPane 没有显示,但是 mkfile() 方法仍然被调用,虽然只有一次:这意味着程序正在运行,但是 JOptionPane 隐藏在后台抓取模态控件并停止循环,如果移除了 gui,然后 io 工作完美。

4

1 回答 1

0

假设您创建的 jar 是一个 RUNNABLE jar(可以使用 java -jar 从终端运行...)...

我建议创建一个运行 jar 的脚本...

run_serviceTest.bat:

@echo off
java -jar C:\Users\ProgrammerSausage\Documents\serviceTest.jar

然后您可以基于该脚本创建 nssm 服务:

nssm install servicetest run_serviceTest.bat

尝试在具有管理员权限的终端上运行该命令。

Nssm 将询问“当前目录”来启动服务。选择包含 jar 的目录。

我看到您的服务使用 JOptionPane 这是一个 GUI 组件。如果您希望您的服务与桌面交互,您需要在服务管理员中启用它:

在此处输入图像描述

您还可以从 nssm 启用桌面交互:

在此处输入图像描述

服务通常不与桌面交互。

于 2018-08-10T01:53:18.427 回答