GUI не отображается на сервисе.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.
Я ввожу свой пароль - похоже, сработало. Проверил службы диспетчера задач, он есть, но "остановлен", я включил, чтобы увидеть, что может произойти, говорит, что он работает. Но ничего. Что я делаю неправильно?
РЕДАКТИРОВАТЬ:
Я изменил консоль на администратора. Создан.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?
РЕДАКТИРОВАТЬ:
Итак, я изменил код программы, потому что, как и предполагалось, он, скорее всего, не позволял отображать графический интерфейс, чтобы включить простой вызов 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 скрыта в фоновом режиме, получая модальное управление и останавливая цикл, и если графический интерфейс удаляется, тогда работает безупречно.
1 ответ
Предполагая, что созданный вами jar-файл - это jan-файл RUNNABLE (его можно запустить из терминала с помощью java -jar ...)...
Я бы предложил создать скрипт, который запускает флягу...
run_serviceTest.bat:
@echo off
java -jar C:\Users\ProgrammerSausage\Documents\serviceTest.jar
Затем вы можете создать сервис nssm на основе этого скрипта:
nssm install servicetest run_serviceTest.bat
Попробуйте запустить команду на терминале с правами администратора.
Nssm запросит "текущий каталог" для запуска службы. Выберите каталог, в котором находится банка.
Я вижу, что ваш сервис использует JOptionPane, который является компонентом GUI. Если вы хотите, чтобы ваши сервисы взаимодействовали с рабочим столом, вам нужно включить его в администраторе сервисов:
Вы также можете включить взаимодействие с рабочим столом из nssm:
Сервисы обычно не взаимодействуют с рабочим столом.