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:

Сервисы обычно не взаимодействуют с рабочим столом.

Другие вопросы по тегам