- Делаем java приложение как windows-сервис
- Введение
- К делу
- Создание Windows службы на Java
- Введение
- Создание минимизированной версии JRE
- Создание Windows службы из любого приложения
- WinSW
- Взаимодействие Java и Windows API
- Работа с процессами
- Взаимодействие с другими компонентами системы
- WebSocket
- HTTP-клиент
- Заключение
- Как создать службу windows из приложения java
- 19 ответов:
Делаем java приложение как windows-сервис
Введение
В общем, расскажу я вам сказку про Terracota’овский сервер. В одной далёкой галактике На одной из наших виртуалок на конторе, жила-была ВебСфера (прожорливая сволочь), которая голодала от недостатка места на жёстом диске и, как результат, приложения живущие на ней начинали сильно лагать, вследствие чего приходилось часто приходилось ребутать вирталку для нормальной жизни приложений на сфере. Но не одиноки мы во вселенной(возможно), тем не менее на Земле так точно не одни, так и на виртуалке кроме сферы жили и другие монстры, куда менее прожорливые, вроде Terracotta сервера и других приложений. Так вот, вследствие перерождения галактики перезагрузки виртуалки терракотовский сервак постоянно надо было поднимать, так как наши приложения хранящие данные в кластере не могли запуститься, потому ожидали коннекшена от лежачего сервака. Естественно, кому-то из команды постоянно приходилось запускать Терракотту вручную, что, в общем, то было утомительно:). Мною было принято решение создать галактический отряд windows сервис по поднятию сервера после перезагрузки виртуалки, что казалось задачей на 15 минут, и тут я наткнулся на Дарта Вейдера подводные камни. Хренова конечно, что из коробки в терракоте нет создания сервиса после установки.
К делу
Посмотрим, что у нас есть:
- Windows Server 2008 какой-то edition(с установленным Windows Resource Kit Tools).
- Установленная JDK6
- Terracotta
Световые мечи
Чего не хватало:
Пива- srvany.exe – утилита, позволяющая запускать любую программу как службу, позволяя тем самым создавать пользовательские службы(странно но у меня на виртуалке этого файла не было). Скачаваем с инета.
- Знаний использования реестра.(Этот недостатот быстро отпадает)
Для начала скопируем скачанный srvany.exe в папки /bin с терракотой. В моём случае нехватало батника для создания сервиса, т.к. путь к терракоте содержал
пробелы. Если кто знает как в консоли прописывать пути без пробелов, прошу писать в комменты.
Сообственно createService.bat:
sc.exe create Terracotta binPath=“c:\Program Files\terracotta-3.2.1_1\bin\srvany.exe” type=own start=auto DisplayName=“Terracotta Server 3.2.1_1”
Думаю пояснений не требуется. Windows сервис требует данных о приложении в регистре. Создаём tcservice.reg:
REGEDIT4
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Terracotta\Parameters]
«Application»=»\»C:\\Java\\jdk1.6.0_17\\bin\\java.exe\\»
«AppParameters»=»-cp c:\\Program Files\\terracotta-3.2.1_1\\lib\\tc.jar -server -Xms4G –Xmx4G -XX:+HeapDumpOnOutOfMemoryError -Dtc.install-root=c:\\Program files\\terracotta-3.2.1_1 com.tc.server.TCServerMain»
«AppDirectory»=»c:\\Program Files\\terracotta-3.2.1_1\\»
И запускаем его. Не знаю почему, да и в общем то времени на разборку не было, но скрипт у меня не запускался, а данные в регистр не попадали:(. Поэтому делаем всё ручками. Запускаем regedit, заходим по пути HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Terracotta\Parameters и создаём там строковые параметры типа Application с указанием путей типа С:\\Java\\jdk1.6.0_17\\bin\\java.exe Также можно применить дополнительные параметры, если терракота работает не с дефолтовыми настройками:
«AppParameters»=»-cp c:\\ Program Files \\terracotta-3.2.1_1\\lib\\tc.jar -server –Xms512M –Xmx512M -XX:+HeapDumpOnOutOfMemoryError -Dtc.install-root=c:\\terracotta\\terracotta-3.2.1_1 com.tc.server.TCServerMain -f c:\\ Program Files \\my-tc-config.xml -n Server1″
Всё сделали. Тестим заходим в Панель Управления -> Администрирование –> Службы, ищем сервис с названием Terracotta Server 3.2.1_1. Запускаем. Провеяем порты и видим, что приложение стартануло, если нет, проверьте правильность указания путей. Надо бы ещё убедиться что приложение встанет после перезагрузки виртуалки. Значит, что делаем? Выключаем сервер из розетки перезагружаем виртуалку – видим, что сервер поднялся автоматически. Ура. Таким макаром можно любое Java приложение сделать как windows сервис.
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.
Создание Windows службы на Java
February 22, 2019 Jazz Team Технические статьи
Введение
В рамках одного из проектов требовалось разработать Windows службу, которая могла бы выполнять ряд действий с помощью Windows API, Websocket и стандартных средств Java. Далее в статье будут описаны шаги, которые были сделаны для создания такой службы.
Потребность в Windows службе возникла из-за необходимости иметь программу со следующими возможностями:
- она должна быть постоянно запущена,
- выполнялась от системного пользователя,
- автоматически запускалась при старте системы,
- чтобы её сложно было остановить обычному пользователю.
Создание минимизированной версии JRE
Так как GraalVM всё ещё не поддерживает создание исполняемых файлов под Windows, было решено воспользоваться другими возможностями, которые предоставляет экосистема Java, а именно создание минимизированной версии JRE.
Для того, чтобы создать минимизированную версию JRE, для начала необходимо узнать зависимости на определенные пакеты, которые будут включены в JRE.
В первую очередь необходимо собрать jar-файл “fat jar” со всеми зависимостями.
Затем выполнить команду jdeps -s , чтобы получить список всех зависимостей. Например:
Далее создаём нашу версию JRE с данными зависимостями:
jlink –module-path –add-modules
java.base,java.datatransfer,java.desktop,java.logging,java.net.http,java.sql,java.xml,jdk.unsupported –strip-debug –compress 2 –no-header-files –no-man-pages –output
Обратите внимание, что перечисление пакетов для опции –add-modules необходимо разделять запятой и не ставить между ними пробелов. Остальные опции отвечают за сжатие и убирание файлов и другой информации, которая не пригодится для выполнения программы.
После выполнения этих действий JRE будет занимать порядка 30 mb, вместо сотен.
Создание Windows службы из любого приложения
Java не имеет стандартных средств по созданию служб, поэтому были изучены сторонние инструменты и был выбран WinSW в силу его бесплатности и простоты использования.
WinSW
WinSW – это утилита, которая позволяет запустить и обернуть любой процесс как Windows службу. Для того, чтобы начать с ней работать, необходимо скачать исполняемый и конфигурационный файлы по этой ссылке https://github.com/kohsuke/winsw/releases.
Необходимо поместить эти два файла в директорию. Переименовать исполняемый файл на своё усмотрение и дать такое же название файлу конфигурации, затем поместить в эту директорию jar-файл приложения и созданную JRE.
В конфигурационном файле необходимо прописать минимальную конфигурацию:
jre\bin\java.exe – относительный путь внутри нашей папки к исполняемому файлу нашей JRE.
После этих действий можно установить службу, для этого необходимо выполнить команду от имени администратора:
Список команд можно посмотреть здесь .
Взаимодействие Java и Windows API
Для использования функций Windows (таких как создание нового процесса или добавление ключей реестра) в нашем приложении был использован JNA.
JNA (Java Native Access) предоставляет Java-программам легкий доступ к библиотекам, написанным на другом языке, без написания чего-либо, кроме кода Java. JNA позволяет напрямую вызывать нативные функции, используя обычный вызов метода Java. Большинство методов не требуют специальной обработки или конфигурации; не требуется шаблон или сгенерированный код.
Подключить и работать с JNA очень просто, для этого необходимо скачать jar-файл или подключить зависимость в сборщик проекта – в нашем случает Maven:
В нашем проекте мы использовали JNA для достижения следующих целей: заблокировать и сделать вновь доступным диспетчер задач 1) по комбинации Ctrl+Shift+Esc и 2) в меню, доступном по комбинации Ctrl+Alt+Del.
Для достижения этого были использованы класс Advapi32Util (удобная обёртка над библиотекой advapi32.dll) и интерфейс WinReg с полезными константами , которые предоставляют функциональность для внесения изменений в реестр Windows (Рисунок 1. Класс TaskManager с методами enable() и disable() для изменения ключей реестра диспетчера задач).
Рисунок 1. Класс TaskManager с методами enable() и disable() для изменения ключей реестра диспетчера задач.
- Создать новый процесс от имени определённого пользователя Windows. Для этого мы использовали метод CreateProcessAsUser()интерфейса Advapi32. В метод необходимо передать следующие параметры:
- hToken – дескриптор токена пользователя, для которого мы запускаем процесс.
- lpApplicationName – имя модуля, который должен быть выполнен.
- lpCommandLine – командная строка для выполнения.
- lpProcessAttributes – указатель на структуру SECURITY_ATTRIBUTES, которая определяет дескриптор безопасности для нового объекта процесса и определяет, могут ли дочерние процессы наследовать возвращенный дескриптор процесса.
- lpThreadAttributes – указатель на структуру SECURITY_ATTRIBUTES, который определяет дескриптор безопасности для нового объекта потока и определяет, могут ли дочерние процессы наследовать возвращенный дескриптор потока.Создать новый процесс от имени определённого пользователя Windows. Для этого мы использовали метод CreateProcessAsUser() интерфейса Advapi32. В метод необходимо передать следующие параметры:
- bInheritHandles – если этот параметр TRUE, каждый наследуемый дескриптор вызывающего процесса наследуется новым процессом. Если параметр FALSE, процессы не наследуются.
- dwCreationFlags – флаги, которые контролируют класс приоритета и создают процесс.
- lpEnvironment – указатель на блок среды для нового процесса. Если этот параметр равен NULL, новый процесс использует среду вызывающего процесса. Блок среды состоит из блока с нулевым завершением строк с нулевым завершением. Каждая строка имеет следующий вид: name = value \ 0.
- lpCurrentDirectory – полный путь к текущему каталогу для процесса. Строка также может указывать путь UNC (universal naming convention).
- lpStartupInfo – указатель на структуру STARTUPINFO или STARTUPINFOEX.lpProcessInformation – указатель на структуру PROCESS_INFORMATION, которая получает идентификационную информацию о новом процессе.
Рисунок 2. Метод для создания нового процесса для определённого пользователя Windows.
- Получить токен активного пользователя, т.к. он необходим для создания процесса от определённого пользователя.
Работа с процессами
Для работы и слежения за процессами в Windows был использован, добавленный в Java 9, класс ProcessHandle. ProcessHandle позволяет получать и производить различные манипуляции с процессами. В частности, при решении задачи, требовалось собирать PID процессов, фильтровать процессы на основе имени и принудительно завершать необходимые процессы.
Рисунок 3. Класс ProcessHandler с методами takeSnapshot() для создания снимка текущих процессов и closeNewProcesses() для завершения процессов, отличных от снимка.
Взаимодействие с другими компонентами системы
WebSocket
Для Java существует стандартизированный API для работы с WebSocket.
Но одного API недостаточно, поэтому для запуска кода была выбрана одна из его реализаций – Tyrus.
Далее можно создать минималистичный сервер и указать обработчики (EndPoints).
Заготовка обработчика выглядит следующим образом:
HTTP-клиент
С выпуском 11-ой версии Java в ней появился удобный HTTP-клиент, поэтому потребность в сторонних клиентах исчезла.
Для создания экземпляра клиента необходимо воспользоваться билдером. В простейшем случае:
Далее необходимо создать запрос(request), например:
Затем этот запрос можно использовать для отправки на сервер:
Заключение
Благодаря модульной организации версий Java 9 и выше, утилите WinSW, обновлённому Process API для взаимодействия с процессами операционной системы и библиотеки JNA (Java Native Access), которая предоставляет программам Java простой доступ к нативным библиотекам, мы смогли создать Windows службу с использованием языка Java, на котором была реализована и серверная часть. Что в итоге позволило не вводить в процесс разработки новый язык.
Как создать службу windows из приложения java
Я только что унаследовал приложение java, которое должно быть установлено в качестве службы на XP и vista. Прошло около 8 лет с тех пор, как я использовал windows в любой форме, и мне никогда не приходилось создавать службу, не говоря уже о чем — то вроде java-приложения (у меня есть jar для приложения и одна зависимость jar-log4j). Какая магия необходима, чтобы сделать этот запуск в качестве службы? У меня есть источник, поэтому модификации кода, хотя и желательно избегать, возможны.
19 ответов:
Apache Commons Daemon является хорошей альтернативой. Он имеет Procrun для служб windows и Jsvc для демонов unix. Он использует менее ограничительную лицензию Apache, и Apache Tomcat использует ее как часть себя для работы на Windows и Linux! Чтобы заставить его работать немного сложно, но есть исчерпывающей статьи С рабочим примером.
кроме того, вы можете посмотреть на bin\service.летучая мышь в 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 () » вызовут ошибки. Если вы не можете изменить эти вызовы, подумайте о создании класса bootstrapper, который может массировать эти вызовы в соответствии с вашим по необходимости.
С Apache Commons Daemon теперь вы можете иметь собственное имя исполняемого файла и значок! вы также можете получить пользовательский монитор лотка Windows с вашим собственным именем и значком!
теперь у меня есть служба, работающая с моим собственным именем и значком (prunsrv.exe) и монитор системного трея (prunmgr.exe) также имеет свое собственное имя и значок!
- скачать двоичные файлы демона Apache Commons (вам понадобится prunsrv.exe и prunmgr.исполняемый.)
- переименовать их в MyServiceName.exe и MyServiceNamew.exe соответственно.
скачать WinRun4J и с помощью RCEDIT.exe программа, которая поставляется с ним, чтобы изменить исполняемый файл Apache, чтобы встроить свой собственный значок, как это:
теперь установите свою службу Windows следующим образом (см. документация для более подробной информации и вариантов):
теперь у вас есть Windows сервис вашего кувшина, который будет работать с вашим собственным значком и именем! Вы также можете запустить монитор файл и он будет работать в системном трее свой значок и имя.
еще один вариант WinRun4J. Это настраиваемый Java launcher, который удваивается как хост службы windows (как 32, так и 64-разрядные версии). Он является открытым исходным кодом и нет ограничений на его использование.
(полное раскрытие: я работаю над этим проектом).
еще один ответ Еще Одна Оболочка Службы Java, это кажется хорошей альтернативой Java Service Wrapper, так как имеет лучшее лицензирование. Он также предназначен для легкого перехода от JSW к YAJSW. Конечно, для меня, совершенно нового для серверов windows и пытающегося получить приложение Java, работающее как служба, это было очень просто в использовании.
некоторые я нашел, но не в конечном итоге с помощью:
- Java Service Launcher Я не использовал это потому что это выглядело более сложным, чтобы получить работу, чем YAJSW. Я не думаю, что это фантик.
- JSmooth создание сервисов окна не является его основной целью, но можно сделать. Я не использовал это, потому что не было активности с 2007 года.
Я думаю Java Service Wrapper работает хорошо. Обратите внимание, что есть тремя способами для интеграции вашего приложения. Похоже, Вариант 1 будет работать лучше для вас, потому что вы не хотите менять код. Файл конфигурации может немного сойти с ума, но просто помните, что (для варианта 1) программа, которую вы запускаете и для которой вы будете указывать аргументы, является их вспомогательной программой, которая затем запустит вашу программу. У них есть пример конфигурационный файл для этого.
JavaService это LGPL. Это очень легко и стабильно. Настоятельно рекомендуемый.
использовать » winsw » который был написан для Glassfish v3, но хорошо работает с программами Java в целом.
требуется установленная среда выполнения .NET.
Я использовал JavaService раньше с хорошим успехом. Он не был обновлен в течение нескольких лет, но был довольно твердым, когда я его использовал.
Мне не понравилось лицензирование для оболочки службы Java. Я пошел с ActiveState Perl, чтобы написать сервис, который выполняет эту работу.
Я думал о написании службы на C#, но мои временные ограничения были слишком жесткими.
Я всегда просто использую sc.exe (см. http://support.microsoft.com/kb/251192). он должен быть установлен на XP с пакетом обновления 1, и если это не в вашем вкусе Vista, вы можете скачать загрузить его с помощью набора ресурсов Vista.
Я не сделал ничего слишком сложного с Java, но используя либо полный аргумент командной строки (x:\java.исполняемый. ) или создание скрипта с Ant для включения depencies и установки параметров отлично работает для меня.
лично нравится launch4j
С Java 8 мы можем справиться с этим сценарием без каких-либо внешних инструментов. javapackager инструмент, поставляемый с java 8, предоставляет возможность создавать автономные пакеты приложений:
-родной тип Создание автономных пакетов приложений (если это возможно). Использовать опцию-B, чтобы предоставить аргументы для пакетов используется. Если указан тип, то создается только пакет этого типа. Если тип не указан, используется все.
следующие значения: допустимо для типа:
в случае windows обратитесь к следующему doc мы можем создать MSI или exe по мере необходимости.
еще один хороший вариант-это FireDaemon. Он используется некоторыми крупными магазинами, такими как NASA, IBM и т. д.; см. Их веб-сайт для полного списка.
в настоящее время мне требуется это для запуска приложения на основе Eclipse, но мне нужно сначала установить некоторые переменные, которые являются локальными для этого приложения. Южная Каролина.exe будет разрешать только исполняемые файлы, но не Скрипты, поэтому я обратился к autoexnt.exe, который является частью Windows 2003 resource kit. Он ограничивает службу одним пакетным файлом, но мне нужен только один пакетный скрипт для преобразования в службу.
это просто, как вы должны поставить ярлык в
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 ‘)
если вы используете инструмент Gradle Build, вы можете попробовать мой Windows-service-plugin, что облегчает использование Apache Commons Daemon Procrun.
чтобы создать приложение-службу java windows с плагином, вам нужно пройти несколько простых шагов.
создайте основной класс обслуживания с соответствующим методом.
включите плагин в свой build.gradle файл.
тот же фрагмент скрипта для нового, инкубационного, плагинного механизма, введенного в Gradle 2.1:
выполнить createWindowsService задача gradle для создания дистрибутива службы windows.
это все, что вам нужно сделать, чтобы создать простую службу Windows. Плагин автоматически загрузит Демон Apache Commons Запустите двоичные файлы, извлеките эти двоичные файлы в каталог распространения службы и создайте пакетные файлы для установки/удаления службы.
на $
-install.bat и если вы хотите удалить службу run
-uninstall.bat . Для запуска и остановки службы используйте
w.exe исполняемый файл.
обратите внимание, что метод служба обработки start должна создать и запустить отдельный поток для выполнения обработки, а затем вернуться. Основной метод вызывается из разных потоков при запуске и остановке сервиса.
для получения дополнительной информации, пожалуйста, прочитайте о плагине и Apache Commons Daemon Procrun.
Exe4j является очень хорошим вариантом, хотя это не бесплатно. Проверьте это на Exe4j в Мастере для создания .exe файл, вы даете возможность создать сервис.