Как создать службу Windows из Java-приложения
Я только что унаследовал Java-приложение, которое необходимо установить в качестве службы на XP и Vista. Прошло около 8 лет с тех пор, как я использовал окна в любой форме, и мне никогда не приходилось создавать сервис, не говоря уже о чем-то вроде java-приложения (у меня есть jar для приложения и один jar зависимости - log4j). В чем заключается магия, необходимая для запуска этого сервиса? У меня есть исходный код, поэтому возможны модификации кода, хотя и желательно их избегать.
21 ответ
Apache Commons Daemon - хорошая альтернатива. Он имеет Procrun для служб Windows и Jsvc для демонов Unix. Он использует менее строгую лицензию Apache, и Apache Tomcat использует ее как часть себя для работы в Windows и Linux! Работать немного сложнее, но есть исчерпывающая статья с рабочим примером.
Кроме того, вы можете взглянуть на bin \ service.bat в Apache Tomcat, чтобы понять, как настроить сервис. В Tomcat они переименовывают двоичные файлы Procrun (prunsrv.exe -> tomcat6.exe, prunmgr.exe -> tomcat6w.exe).
Что-то, с чем я боролся при использовании Procrun, ваши методы start и stop должны принимать параметры (String[] argv). Например, "start(String[] argv)" и "stop(String[] argv)" будут работать, но "start()" и "stop()" будут вызывать ошибки. Если вы не можете изменить эти вызовы, подумайте о создании класса начальной загрузки, который может обрабатывать эти вызовы в соответствии с вашими потребностями.
С Apache Commons Daemon теперь вы можете иметь собственное имя исполняемого файла и значок! Вы также можете получить собственный монитор Windows в трее с вашим собственным именем и значком!
Теперь моя служба работает с моим собственным именем и значком (prunsrv.exe), а у монитора в системном трее (prunmgr.exe) также есть мое собственное имя и значок!
- Загрузите двоичные файлы Apache Commons Daemon (вам понадобятся prunsrv.exe и prunmgr.exe).
- Переименуйте их в
MyServiceName.exe
а такжеMyServiceNamew.exe
соответственно. Скачайте WinRun4J и используйте
RCEDIT.exe
Программа, которая поставляется с ним, чтобы изменить исполняемый файл Apache, чтобы встроить свой собственный значок, например:> RCEDIT.exe /I MyServiceName.exe customIcon.ico > RCEDIT.exe /I MyServiceNamew.exe customTrayIcon.ico
Теперь установите службу Windows следующим образом (см. Документацию для получения дополнительной информации и параметров):
> MyServiceName.exe //IS//MyServiceName \ --Install="C:\path-to\MyServiceName.exe" \ --Jvm=auto --Startup=auto --StartMode=jvm \ --Classpath="C:\path-to\MyJarWithClassWithMainMethod.jar" \ --StartClass=com.mydomain.MyClassWithMainMethod
Теперь у вас есть служба Windows вашего Jar, которая будет работать с вашим собственным значком и именем! Вы также можете запустить файл монитора, и он будет работать в системном трее с вашим собственным значком и именем.
Простой способ - это NSSM Wrapper Wrapper ( см. Мою запись в блоге).
Еще один вариант - WinRun4J. Это настраиваемый модуль запуска Java, который служит хостом службы Windows (32- и 64-разрядные версии). Это открытый исходный код и нет никаких ограничений на его использование.
(полное раскрытие: я работаю над этим проектом).
Еще один ответ - это еще один Java Service Wrapper, это похоже на хорошую альтернативу Java Service Wrapper, поскольку имеет лучшее лицензирование. Он также предназначен для простого перехода с JSW на YAJSW. Разумеется, для меня, новичка в Windows-серверах и для того, чтобы приложение Java работало как сервис, им было очень легко пользоваться.
Некоторые другие я нашел, но в итоге не использовал:
- Java Service Launcher Я не использовал это, потому что работать было сложнее, чем YAJSW. Я не думаю, что это обертка.
- Услуги JSmooth Create Window не являются его основной целью, но могут быть выполнены. Я не использовал это, потому что не было никакой активности с 2007 года.
Если вы используете Gradle Build Tool, вы можете попробовать мой плагин windows-service, который облегчает использование Apache Commons Daemon Procrun.
Чтобы создать приложение-службу java для Windows с плагином, вам нужно пройти несколько простых шагов.
Создайте основной класс обслуживания с помощью соответствующего метода.
public class MyService { public static void main(String[] args) { String command = "start"; if (args.length > 0) { command = args[0]; } if ("start".equals(command)) { // process service start function } else { // process service stop function } } }
Включите плагин в свой
build.gradle
файл.buildscript { repositories { maven { url "https://plugins.gradle.org/m2/" } } dependencies { classpath "gradle.plugin.com.github.alexeylisyutenko:windows-service-plugin:1.1.0" } } apply plugin: "com.github.alexeylisyutenko.windows-service-plugin"
Тот же фрагмент скрипта для нового инкубационного механизма плагинов, представленный в Gradle 2.1:
plugins { id "com.github.alexeylisyutenko.windows-service-plugin" version "1.1.0" }
Настройте плагин.
windowsService { architecture = 'amd64' displayName = 'TestService' description = 'Service generated with using gradle plugin' startClass = 'MyService' startMethod = 'main' startParams = 'start' stopClass = 'MyService' stopMethod = 'main' stopParams = 'stop' startup = 'auto' }
Запустите задачу gradle createWindowsService, чтобы создать дистрибутив службы Windows.
Это все, что вам нужно сделать, чтобы создать простой сервис Windows. Плагин автоматически загружает двоичные файлы Apache Commons Daemon Procrun, распаковывает эти двоичные файлы в каталог распространения службы и создает пакетные файлы для установки / удаления службы.
В ${project.buildDir}/windows-service
В каталоге вы найдете исполняемые файлы службы, пакетные сценарии для установки / удаления службы и все библиотеки времени выполнения. Для установки сервиса запустите <project-name>-install.bat
и если вы хотите удалить службу, запустите <project-name>-uninstall.bat
, Для запуска и остановки использования сервиса <project-name>w.exe
исполняемый файл.
Обратите внимание, что метод обработки службы start должен создать и запустить отдельный поток для выполнения обработки, а затем вернуться. Основной метод вызывается из разных потоков при запуске и остановке службы.
Для получения дополнительной информации, пожалуйста, прочитайте о плагине и Apache Commons Daemon Procrun.
Я думаю, что Java Service Wrapper работает хорошо. Обратите внимание, что есть три способа интеграции вашего приложения. Похоже, вариант 1 будет работать лучше для вас, учитывая, что вы не хотите менять код. Файл конфигурации может немного сойти с ума, но просто помните, что (для варианта 1) программа, которую вы запускаете и для которой вы будете задавать аргументы, является их вспомогательной программой, которая затем запустит вашу программу. У них есть пример файла конфигурации для этого.
Используйте " winsw", который был написан для Glassfish v3, но в целом хорошо работает с программами на Java.
Требуется установленная среда.NET.
JavaService - это LGPL. Это очень легко и стабильно. Настоятельно рекомендуется.
С Java 8 мы можем справиться с этим сценарием без каких-либо внешних инструментов. Утилита javapackager, поставляемая с java 8, позволяет создавать автономные пакеты приложений:
-native type Создание автономных пакетов приложений (если возможно). Используйте параметр -B для предоставления аргументов используемым упаковщикам. Если указан тип, то создается только пакет этого типа. Если тип не указан, используется все.
Следующие значения действительны для типа:
-native type
Generate self-contained application bundles (if possible). Use the -B option to provide arguments to the bundlers being used. If type is specified, then only a bundle of this type is created. If no type is specified, all is used.
The following values are valid for type:
all: Runs all of the installers for the platform on which it is running, and creates a disk image for the application. This value is used if type is not specified.
installer: Runs all of the installers for the platform on which it is running.
image: Creates a disk image for the application. On OS X, the image is the .app file. On Linux, the image is the directory that gets installed.
dmg: Generates a DMG file for OS X.
pkg: Generates a .pkg package for OS X.
mac.appStore: Generates a package for the Mac App Store.
rpm: Generates an RPM package for Linux.
deb: Generates a Debian package for Linux.
В случае окон см. Следующий документ, мы можем создать MSI или EXE по мере необходимости.
exe: Generates a Windows .exe package.
msi: Generates a Windows Installer package.
Довольно хорошее сравнение различных решений доступно по адресу: http://yajsw.sourceforge.net/
Лично, как launch4j
Мне не понравилось лицензирование для Java Service Wrapper. Я пошел с ActiveState Perl, чтобы написать сервис, который делает эту работу.
Я думал о написании сервиса на C#, но мои временные ограничения были слишком жесткими.
Я использовал JavaService раньше с хорошим успехом. Он не обновлялся через пару лет, но когда я использовал его, он был довольно твердым.
Я всегда просто использую sc.exe (см. Http://support.microsoft.com/kb/251192). Он должен быть установлен на XP с пакетом обновления 1 (SP1), и, если он не в вашем вкусе Vista, вы можете загрузить его с помощью комплекта ресурсов Vista.
Я не сделал ничего слишком сложного с Java, но использование полностью определенного аргумента командной строки (x:\java.exe ....) или создание сценария с Ant для включения зависимостей и установки параметров отлично работает для меня.
Это просто, как вы должны поставить ярлык в
Windows 7 C:\users\All Users\Start Menu\Programs\Startup
(Admin) или User home directory(%userProfile%)
Windows 10: в работе shell:startup
в своем свойстве -> ярлык -> цель -> java.exe -jar D:\..\runJar.jar
ПРИМЕЧАНИЕ: это будет работать только после входа в систему
С правами администратора
sc create serviceName binpath= "java.exe -jar D:\..\runJar.jar"
Создаст службу windows
если вы используете тайм-аут cmd /c D:\JAVA7~1\jdk1.7.0_51\bin\java.exe -jar d:\jenkins\jenkins.war
но даже с этим вы получите тайм-аут, но в фоновом режиме будет запущен java.exe. Проверьте в диспетчере задач
ПРИМЕЧАНИЕ. Это будет выполняться при запуске входа в систему Windows (перед входом в систему на основе службы '). Startup Type
")
Последние несколько лет я использую jar2exe для запуска наших Java-приложений как службы в Windows. Он предоставляет возможность создать exe-файл, который можно установить как службу Windows.
Службу Windows можно реализовать на 100 % в коде Java, комбинируя использование внешней памяти и API-интерфейса компоновщика (предварительный просмотр с JDK16 и выше) с проектом jextract OpenJDK для обработки обратных вызовов службы Windows, а затем используйте jpackage для создания исполняемого файла Windows, который может затем зарегистрируйтесь как служба Windows.
См. этот пример, в котором описывается работа, необходимая для реализации службы Windows . Все EXE-файлы службы Windows должны обеспечивать обратные вызовы для основной точки входа ServiceMain и Service Control Handler , а также использовать вызовы API StartServiceCtrlDispatcherW , RegisterServiceCtrlHandlerExW и SetServiceStatus вAdvapi.DLL
.
Поток вышеуказанных обратных вызовов в Java со структурами внешней памяти:
main()
Must register ServiceMain using StartServiceCtrlDispatcherW
Above call blocks until ServiceMain exits
void ServiceMain(int dwNumServicesArgs, MemoryAddress lpServiceArgVectors)
Must register SvcCtrlHandler using RegisterServiceCtrlHandlerExW
Use SetServiceStatus(SERVICE_START_PENDING)
Initialise app
Use SetServiceStatus(SERVICE_RUNNING)
wait for app shutdown notification
Use SetServiceStatus(SERVICE_STOPPED)
int SvcCtrlHandler(int dwControl, int dwEventType, MemoryAddress lpEventData, MemoryAddress lpContext)
Must respond to service control events and report back using SetServiceStatus
On receiving SERVICE_CONTROL_STOP reports SetServiceStatus(SERVICE_STOP_PENDING)
then set app shutdown notification
После завершения приложения Java jpackage может создать среду выполнения + EXE, которую затем можно установить и зарегистрировать как службу Windows. Запуск от имени администратора (пробелы после = важны):
sc create YourJavaServiceName type= own binpath= "c:\Program Files\Your Release Dir\yourjavaservice.exe"
Еще один хороший вариант - FireDaemon. Он используется в некоторых крупных магазинах, таких как NASA, IBM и т. Д.; см. их веб-сайт для полного списка.
В настоящее время мне требуется, чтобы это запускало приложение на основе Eclipse, но мне нужно сначала установить некоторые переменные, которые являются локальными для этого приложения. sc.exe разрешает только исполняемые файлы, но не скрипты, поэтому я обратился к autoexnt.exe, который является частью набора ресурсов Windows 2003. Он ограничивает службу одним пакетным файлом, но мне нужен только один пакетный сценарий для преобразования в службу.
Чао!
Exe4j - очень хороший вариант, хотя и не бесплатный. Проверьте это в Exe4j. В мастере для создания файла.exe вы можете создать службу.