Как создать службу Windows из java jar?
-
06-07-2019 - |
Вопрос
У меня есть исполняемый JAR-файл.Возможно ли создать службу Windows из этого JAR?На самом деле, я просто хочу запустить это при запуске, но я не хочу помещать этот JAR-файл ни в свою папку автозагрузки, ни в реестр.
Решение
Эта статья должна рассказать вам все, что вам нужно знать: " Запуск приложений Java в качестве службы Windows " ; упоминается использование " Java Service Wrapper " (существует издание сообщества под названием YAJSW )
Другие советы
Самое простое решение, которое я нашел для этого на данный момент, - это Менеджер не сосущих услуг
Использование будет
nssm install <servicename> "C:\Program Files\Java\jre7\java.exe" "-jar <path-to-jar-file>"
Используйте nssm.exe, но не забудьте установить AppDirectory, иначе все необходимые библиотеки или ресурсы будут недоступны. По умолчанию nssm устанавливает текущий рабочий каталог в каталог приложения, java.exe, а не в jar. Так что сделайте это, чтобы создать пакетный скрипт:
pushd <path-to-jar>
nssm.exe install "<service-name>" "<path-to-java.exe>" "-jar <name-of-jar>"
nssm.exe set "<service-name>" AppDirectory "<path-to-jar>"
Это должно исправить проблему с приостановленной службой.
Я экспериментировал с Apache Commons Daemon . Он поддерживает Windows ( Procrun ) и Unix ( Jsvc ). У расширенного установщика есть учебник по Java-сервису с примером проекта. скачивать. Если вы запустили их javaservice.jar в качестве службы Windows, вы можете проверить его с помощью " telnet 4444 " ;. Я использовал их пример, потому что я сосредоточился на том, чтобы запустить службу Windows Java, а не писать Java.
Тануки изменил лицензию на jsw некоторое время назад, и если бы я собирался начать проект, я бы использовал еще одну оболочку Java-сервиса, http://yajsw.sourceforge.net/ это более или менее реализация с открытым исходным кодом, которая имитирует JWS, а затем основывается на ней и еще больше улучшает ее.
РЕДАКТИРОВАТЬ: Я использую YAJSW в течение нескольких лет на нескольких платформах (Windows, несколько Linux ...), и это здорово, разработка продолжается.
С помощью procrun вам нужно скопировать prunsrv в каталог приложения (Скачать), и создайте install.bat следующим образом:
set PR_PATH=%CD%
SET PR_SERVICE_NAME=MyService
SET PR_JAR=MyService.jar
SET START_CLASS=org.my.Main
SET START_METHOD=main
SET STOP_CLASS=java.lang.System
SET STOP_METHOD=exit
rem ; separated values
SET STOP_PARAMS=0
rem ; separated values
SET JVM_OPTIONS=-Dapp.home=%PR_PATH%
prunsrv.exe //IS//%PR_SERVICE_NAME% --Install="%PR_PATH%\prunsrv.exe" --Jvm=auto --Startup=auto --StartMode=jvm --StartClass=%START_CLASS% --StartMethod=%START_METHOD% --StopMode=jvm --StopClass=%STOP_CLASS% --StopMethod=%STOP_METHOD% ++StopParams=%STOP_PARAMS% --Classpath="%PR_PATH%\%PR_JAR%" --DisplayName="%PR_SERVICE_NAME%" ++JvmOptions=%JVM_OPTIONS%
Я предполагаю, что
- запустите это из той же директории, где банки и prunsrv.exe есть
- у jar есть свой рабочий МАНИФЕСТ.MF
- и у вас есть перехваты завершения работы, зарегистрированные в JVM (например, с помощью context.registerShutdownHook() весной)...
- не использовать относительные пути для файлов за пределами jar (например, log4j следует использовать с log4j.appender.X.Файл=${app.home}/журналы/my.log или что-то подобное)
Проверьте правильность выполнения руководство пользователя и этот учебник для получения дополнительной информации.
Для этого мы используем сервисный упаковщик Tanuki . Это очень настраиваемый.
Другим вариантом является winsw: https://github.com/kohsuke/winsw/ р>
Сконфигурируйте xml-файл, чтобы указать имя службы, что выполнять, какие-либо аргументы и т. д. И использовать exe для установки. Пример xml: https://github.com/kohsuke/winsw/tree/master/examples р>
Я предпочитаю это nssm, потому что это один легкий exe; и конфиг xml легко поделиться / зафиксировать в исходном коде.
PS служба устанавливается путем запуска your-service.exe install