使用NSSM

时间:2018-08-10 01:42:18

标签: java user-interface service jar nssm

使用一个简单的程序测试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.

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

编辑:

我已将控制台更改为admin。创建了一个.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!

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

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可以正常工作。

1 个答案:

答案 0 :(得分: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的目录。

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

enter image description here

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

enter image description here

服务通常不与桌面交互。