使用一个简单的程序测试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可以正常工作。
答案 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。如果您希望服务与桌面交互,则需要在服务管理员中启用它:
您还可以通过nssm启用桌面交互:
服务通常不与桌面交互。