用一个简单的程序测试 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 工作完美。