Я решил использовать другой инструмент для запуска моего приложения в качестве службы: NSSM
С его помощью я регистрирую параметр в NSSM следующим образом:
nssm install my-service-name "java -jar snapshot.jar"
nssm set my-service-name AppEvents "Start/Pre" "cmd /c copy /y my-app.jar snapshot.jar"
nssm set my-service-name AppExit Default Exit
nssm set my-service-name AppExit 2 Restart
nssm set my-service-name AppDirectory "c:\path\to\my\app"
Итак, эти строки будут:
- Зарегистрировать службу Windows с именем
my-service-name
, которая запускает копию моего приложения jar (java). - Установить параметр для
NSSM
для копированияmy-app.jar
до snapshot.jar
перед запуском службы. - Установите для параметра значение
NSSM
, чтобы указать, что при завершении работы моего приложения поведение по умолчанию предполагает, что служба должна остановиться - Установитьпараметр
NSSM
, чтобы указать, что когда мое приложение завершает работу с кодом выхода 2 , оно должно быть перезапущено (мое приложение Java), и служба должна продолжать работать. - Установитепараметр
NSSM
, чтобы указать, что мое приложение будет использовать текущий каталог как c:\path\to\my\app
Другое решение заключается в создании пакетного файла чтобы быть в цикле, как это (я назвал это run-app.bat
):
@echo off
set java=C:\Program Files (x86)\Java\jre1.8.0_192
:start
copy /y my-app.jar snapshot.jar
if %errorlevel% equ 0 goto :run
if %errorlevel% neq 0 goto :end
:run
"%java%\bin\java.exe" -jar snapshot.jar --start
if %errorlevel% equ 2 goto :start
:end
exit /b %errorlevel%
И используя тNSSM зарегистрирует службу простым способом:
nssm install my-service-name "cmd /c run-app.bat"
nssm set my-service-name AppDirectory "c:\path\to\my\app"
В этом случае NSSM просто запустит мою партию run-app.bat
. Пакет будет оставаться в цикле (перезапускать мое приложение), пока приложение выходит с кодом 2
.