Java приложение как служба windows
Перейти к содержимому

Java приложение как служба windows

  • автор:

Jar файл как служба windows (и бонусом jar to exe)

Итак, ваш проект дожил до продакшена и хотелось бы стартовать его вместе с системой, а не поднимать ручками каждый раз. Но как нам это сделать с обычным jar’ником?

Есть кучка вариантов:

I) Положить в стартап винды батник с запуском java -jar или экзешник (предварительно сделав из jar’а exe-файл).

Windows 7 : C:\users\All Users\Start Menu\Programs\Startup(Admin) or User home directory(%userProfile%)Windows 10 : In Run shell:startup

Это решит проблему, вот только запускаться ваше приложение будет в лучшем случае при первом входе в систему любого юзера (если кинуть в стартап для all users), а, как известно, хороший админ на сервер не лазит.

II) Сделать task в винде, стартующий батник при старте системы.

Этот вариант решает проблему с запуском на ура, вот только манипуляция приложением на этом заканчивается, ни старт-стопа тебе в любое время, ни перезапуска по ошибке.

III) Можно запустить jar’ник в виде службы винды с помощью sc.exe (есть ещё Srvinstw.exe — гуёвая версия, но мы же тру-программисты и должны использовать командную строку).

Это маленькая программа из Resource Kit для создания служб из exe-шников.

Но у нас ведь jar-файл?! Не беда! Есть варианты на попробовать:

1) запускать напрямую java.exe -jar с параметрами.

2) сделать из jar’a exe-file и превратить его в службу.

3) юзать srvany.exe

а) запускать из него java.exe –jar

б) написать bat-ник с запуском java -jar и запускать его

IV) Заюзать сторонний софт.

Разгребём эту кучку, пропустив первые 2 пункта как наименее интересные.

0) Приложение

Для начала напишем небольшое приложение c блэк-джеком и ресурсами, зависимыми от передаваемых параметров, дабы прочувствовать максимум боли в агонии попыток заставить его работать в виде службы.

— ругаться на то, что параметров нет

— в зависимости от них читать те или иные файлики настроек

— парсить внешней библиотекой эти настройки

— каждые 5 секунд сыпать в лог снова эти же настройки

Пример приложения можно посмотреть здесь:

Моим результатом будет executable jar-файл, с зависимыми библиотеками и ресурсами снаружи в отдельной папке. Вы можете сделать, как хотите, поэкспериментируйте.

1) Запуск службы с sc.exe

Итак, чтобы ознакомиться со справкой sc достаточно ввести

sc –bla_bla

Результатом будет «Ошибка. Неопознанная команда» и далее справка по возможным командам.

А) Создаём службу с java.exe –jar

sc create TestServ4 binPath= “E:\Java\JavaPrograms\jdk-11.0.1\bin\java.exe -Xmx400m -jar E:\Java\JavaPrograms\test\withoutSpaces\mainTutorial-1.0-SNAPSHOT.jar amazing prod” type= own start= auto error= normal DisplayName= TestService4

У меня jdk таскается за собой, чтобы не зависеть от имеющихся на серверах версий и для придачи моей программе солидности в виде большого объёма. Полный путь к java.exe в случае наличия её в переменных окружения, не обязателен. Стоит отметить одну назойливую и малозаметную особенность: « binPath= » — после любого параметра (тут binPath) сразу идёт знак равенства, а после него обязательно пробел перед значением этого параметра.

Отлично, служба создана, запускаем её! Упс.

(у меня TestService будет иметь в примерах разные цифры, т.к. не всегда служба удалялась сразу, иногда она только помечалась на удаление)

Смотрим на всякий случай, не появился ли лог нашего приложения. А он-таки есть! Только крохотный, содержащий инфу с момента попытки запуска службы до момента выдачи ошибки. Что произошло? А вот что:

— старт службы запустил java.exe с нужными параметрами

— наше приложение начало свою работу

— менеджер служб винды ждёт некоторое время ответа от java.exe о её успешном (или нет) запуске

— но java.exe ничего не возвращает, потому что она никому ничего не должна

— менеджер служб отсчитал положенные по таймауту секунды и отстрелил джаву

Вывод: не каждый exe-шник одинаково полезен для запуска в виде службы. Нельзя просто так взять и запустить любой exe-шник, он должен быть специально заточен под виндовые службы (как минимум возвращать некие данные о своём запуске).

А может javaw попробуем? Попробуйте, вот только double-V в имени не означает двойную победу.

Б) Создаём службу с cmd /c java.exe -jar

А что если запустить cmd в cmd в cmd и в ней бахнуть джаву? Закроется вся цепочка? Начнём с малого — запустим просто джаву из cmd, а саму cmd укажем как binpath при запуске службы:

sc create TestServ3 binPath= “cmd /c E:\Java\JavaPrograms\jdk-11.0.1\bin\java.exe -Xmx400m -jar E:\Java\JavaPrograms\test\withoutSpaces\mainTutorial-1.0-SNAPSHOT.jar amazing prod” type= own start= auto error= normal DisplayName= TestService3

Точно также отваливаемся по тайм-ауту, вот только завершает свою никчёмную жизнь лишь процесс cmd, а наше мега джава приложение продолжает дышать и радовать.

Работает? Да! Как полноценная служба? Да ни в зуб!

Но положим наш джарник в папку с пробелами, чтобы ещё немного поэкранировать насладиться созиданием наклонных палочек подле кавычек:

sc create TestServ6 binPath= “cmd /c E:\Java\JavaPrograms\jdk-11.0.1\bin\java.exe -Xmx400m -jar \”E:\Java\JavaPrograms\test\with Spaces\mainTutorial-1.0-SNAPSHOT.jar\” amazing prod” type= own start= auto error= normal DisplayName= TestService6

Заглянем в реестр:

Выглядит неплохо, только параметры бы ещё в кавычки запихнуть для полного счастья.

Вывод: трюки — это хорошо, но не всегда полезно на все 100%.

В) Создаём службу с srvany.exe java.exe –jar

srvany.exe — это тоже программулина из Resource Kit. Её работа проста — запускать указанное приложение. Т.е. мы регистрируем srvany.exe в качестве службы с параметрами, указывающими путь к нашей программе. Порядок: стартуем службу → стартует srvany → стартует наше приложение.

sc create TestServ6 binPath= “E:\Java\JavaPrograms\test\with Spaces\srvany.exe” type= own start= auto error= normal DisplayName= TestService6

Добавим параметры для запуска srvany:

reg add “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\TestServ6\Parameters” /v “Application” /d “\”E:\Java\JavaPrograms\jdk-11.0.1\bin\javaw.exe\” -Xmx400m -jar \”E:\Java\JavaPrograms\test\with Spaces\mainTutorial-1.0-SNAPSHOT.jar\” \”amazing\” \”prod\””

Стартуем.. наблюдаем.. ждём.. наблюдаем.. работает!! Всё? Это конец? Или чего-то не хватает? Зачем придумывали сторонний софт (кроме цели самообучения и рекламы)? А вы попробуйте убить процесс или вызвать в нём ошибку. А мы плавно перейдём к следующему пункту.

Вывод: srvany работает, но хромает ловля ошибок.

2) Запуск службы сторонним софтом NSSM.

Краткий список разного софта:

— jsvc (версия для извращенцев: «It can run on Win32 via the Cygwin emulation layer» (с))

Вот последний-то мы и используем. Для ленивых повторим вопрос: так зачем нам сторонний софт? Для них же ответ есть прямо с сайта nssm:

«srvany and other service helper programs suck because they don’t handle failure of the application running as a service. If you use such a program you may see a service listed as started when in fact the application has died. nssm monitors the running service and will restart it if it dies.»

Как оно работает? Всё также: nssm.exe устанавливается в качестве службы с определёнными параметрами, при старте этой службы запускается сам nssm.exe, который в свою очередь запускает java.exe –jar. Вот вам сразу наглядный запуск в диспетчере задач:

Теперь по порядку. Выполняем « nssm.exe install TestServ » для запуска GUI.

Тоже самое можем сделать с помощью командной строки:

nssm install TestServ “E:\Java\JavaPrograms\jdk-11.0.1\bin\java.exe” “-Xmx400m -jar \”E:\Java\JavaPrograms\test\with Spaces\mainTutorial-1.0-SNAPSHOT.jar\” \”amazing\” \”prod\””nssm set TestServ DisplayName “Test Service”nssm set TestServ AppDirectory “E:\Java\JavaPrograms\test\with Spaces”nssm set TestServ AppRestartDelay 1000nssm set TestServ Description “Start java.exe with params -Xmx400m -jar mainTutorial.jar amazing prod”

AppDirectory установить для нас важно, т.к. используемые нами конфиги и библиотеки лежат именно там, рядом с нашим приложением в поддиректориях resources, res.

Если служба вам надоела, или вы накосячили при её создании, то выполните команду:

nssm remove TestServ

Поглядим впритык на записи в реестре:

Все параметры и кавычки в них на месте. Смотрим инфу о службе:

Запускаем службу.. Ура! Всё работает, логи пишутся!

jun. 23, 2019 9:33:29 AM net.snatchTech.tutorials.App mainCONFIG: The app has been started with name: amazing_prodjun. 23, 2019 9:33:30 AM net.snatchTech.tutorials.App lambda$main$3INFO:servicename : serviceid : prodname_id : service_prodoptionsnumber : 1string : smthjun. 23, 2019 9:33:35 AM net.snatchTech.tutorials.App lambda$main$3INFO:servicename : serviceid : prodname_id : service_prodoptionsnumber : 1string : smth

Попробуйте убить джаву или зафейлить своё приложение изнутри.

Вывод: сторонний софт, не написанный нашими великолепными руками, мозгами и ногами, тоже имеет право на жизнь.

3) Автоматизируй это!

Негоже ручками запускать на 30 серверах, нужен скрипт! Опустим раскидывание по тачкам, сделаем хотя бы создание службы, чтобы можно было заменить одно имя переменной, и всё корректно создалось, и запустилась именно та конфигурация для вашего приложения, которая нужна на текущем сервере.

Но скрипт — это же просто! Уверены? А если в имена добавить пробелы? Боль кроется в деталях тонкой настройки кавычек и их экранирования. Допустим, выносим мы AppDir в переменную. Как должны записать её в параметрах и в качестве текущей директории, где кавычки надо, а где нет?

set AppDir=”E:\Java\JavaPrograms\test\with Spaces\” илиset AppDir=”E:\Java\JavaPrograms\test\with Spaces\\” илиset AppDir=”E:\Java\JavaPrograms\test\with Spaces”

использование в параметрах:

nssm install %SrvName% %PathToProg% “%ProgParams% -jar %AppDir%%AppName% %AppParams% илиnssm install %SrvName% \”%PathToProg%\” “%ProgParams% -jar \”%AppDir%%AppName%\” %AppParams%” илиnssm install %SrvName% %PathToProg% “%ProgParams% -jar \”%AppDir%\\%AppName%\” %AppParams%”

как текущая директория:

nssm set %SrvName% AppDirectory %AppDir% илиnssm set %SrvName% AppDirectory \”%AppDir%\”

При неправильной настройке можно получить такую ошибку при старте службы:

Идём за подробностями в журнал системных событий:

Смотрим, что не так с путями в реестре:

Исходя из результата делаем выводы по лишним/недостающим кавычкам или отсутствующим слэшам в нужных местах.

Итоговый скрипт выглядит так:

@echo onset WrapperPath=”E:\Java\JavaPrograms\service\nssm.exe”set SrvName=”TestServ”set SrvDispName=”Test Service”set PathToProg=”E:\Java\JavaPrograms\jdk-11.0.1\bin\java.exe”set ProgParams=”-Xmx400m”set AppDir=”E:\Java\JavaPrograms\test\with Spaces”set AppName=”mainTutorial-1.0-SNAPSHOT.jar”set AppParams=\”amazing\” \”prod\”%WrapperPath% stop %SrvName%%WrapperPath% remove %SrvName% confirm%WrapperPath% install %SrvName% %PathToProg% “%ProgParams% -jar \”%AppDir%\\%AppName%\” %AppParams%”%WrapperPath% set %SrvName% DisplayName %SrvDispName%%WrapperPath% set %SrvName% AppDirectory %AppDir%%WrapperPath% set %SrvName% AppRestartDelay 1000%WrapperPath% set %SrvName% Description “Start %PathToProg% with params %ProgParams% -jar \”%AppDir%\\%AppName%\” %AppParams%”

А в реестре в параметрах так:

Давайте-ка протестируем рестарт. Запустим с выбросом ошибки в параллельном треде, чтобы приложение само завершилось после двух итераций.

set AppParams=\”amazing\” \”prod\” 2

Наблюдаем за файлами логов, видим их пересоздание, а значит служба наша рестартит приложение по его завершении. Отлично! Даже логи в системном журнале присутствуют с источником nssm:

Program E:\Java\JavaPrograms\jdk-11.0.1\bin\java.exe for service TestServ exited with return code 0.Killing process tree of process 11196 for service TestServ with exit code 0Service TestServ action for exit code 0 is Restart. Attempting to restart E:\Java\JavaPrograms\jdk-11.0.1\bin\java.exe.Service TestServ ran for less than 1500 milliseconds. Restart will be delayed by 2000 milliseconds.

Вывод: автоматизируйте всё, что нужно, а не всё, что можно, иначе может уйти больше времени на бесполезную работу.

4) Бонус: jar to exe

Теперь попробуем конвертнуть/обернуть/запихнуть наш jar-файл в exe-шник и запустить его как службу.

Вот пара вариантов:

А) средствами JDK, а именно JavaPackager (JDK8, JDK10, JDK11).

Сам я пока не попробовал, там очень много возможностей, но для наших целей сейчас это немного заморочисто.

Б) подборочка со стековерфлоу.

В) Launch4j — отдельностоящей прогой или через плагин к мавену.

Воспользуемся отдельностоящей launch4j.

Заполняем ГУЁвую формочку, указывая на джарник, его параметры, пытаемся встроить jdk внутрь:

Однако, запуск не произвести, кнопка «старт» высвечена. Что не так? Попробуем сохранить настройки и запустить из консоли:

launch4jc.exe “E:\Java\JavaPrograms\test\with Spaces\exe\mainTutL4j.xml”
Error: A JNI error has occurred, please check your installation and try againException in thread “main” java.lang.UnsupportedClassVersionError: net/snatchTech/tutorials/App has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0

ах да, по скрину не видно, но я сначала поигрался и указал макс версию jre 9, а надо 11. Стираем версию jre, запускаем, получаем:

some error: This application was configured to use a bundled Java Runtime Environment but the runtime is missing or corrupted.

Хмм.. добавим в Boundled JRE Path «\javaw.exe». Не работает. Стираем и javaw и папку bin. Вуаля! Но подождите, запустим теперь exe-шник:

E:\Java\JavaPrograms\test\with Spaces\exe>mainTut.exeError: Unable to initialize main class net.snatchTech.tutorials.AppCaused by: java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/type/TypeReference

Аааррргх.. это должен быть толстый джарник.. окей, переместим папку resources. Запускаем.. Да! Работает!

По запущенным процессам видно, что в нашем случае mainTut.exe — просто обёртка, запускающая java-exe –jar с параметрами. Более того, в параметре пути к jar стоит сам mainTut.exe! Давайте попробуем открыть архиватором наш exe-шник:

Собственно, здесь лежит тоже самое, что в нашем jar-нике.

Один момент — у нас якобы встроена JRE должна быть, хотя по размеру и внутренностям архива этого не заметно. Попробуем-ка переименовать папку с jdk для проверки. Так и есть, не работает. В общем не будем мучиться со всеми связями, главное — есть рабочий вариант и надо его затестить в виде службы.

sc create TestServ4 binPath= “E:\Java\JavaPrograms\test\with Spaces\exe\mainTut.exe” type= own start= auto error= normal DisplayName= TestService4

но результат неутешительный, как через cmd — mainTut.exe закрывается, а java.exe остаётся. + как-то надо прокидывать разные аргументы до jar’а, а то сейчас они вшиты в exe-шник.

Вывод: просто обернуть ваш jar-ник в exe не даст никакого профита для запуска его в виде службы. Да и вообще никакого профита. Оборачивать имеет смысл скорее для сборки в инсталляционный пакет.

Общий вывод.

Используем NSSM для запуска jar-ов в виде службы и радуемся безотказной работе!

Не стесняйтесь пожать руку на Medium или Telegram.

Краткое руководство. Создание приложения Java в службе приложение Azure

В этом кратком руководстве вы будете использовать подключаемый модуль Maven для службы приложение Azure веб-приложения для развертывания веб-приложения Java на сервере Linux Tomcat в службе приложение Azure. Служба приложений предоставляет высокомасштабируемую веб-службу размещения веб-приложений. Используйте вкладки для переключения между инструкциями по Tomcat, JBoss или внедренным серверам (Java SE).

Screenshot of Maven Hello World web app running in Azure App Service.

Если вы не хотите использовать Maven в качестве средства разработки, ознакомьтесь с аналогичными руководствами для разработчиков Java:

Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начинать работу.

1. Использование Azure Cloud Shell

В Azure есть Azure Cloud Shell, интерактивная оболочка среды, с которой можно работать в браузере. Для работы со службами Azure можно использовать Bash или PowerShell с Cloud Shell. Для запуска кода из этой статьи можно использовать предварительно установленные команды Cloud Shell. Ничего дополнительного в локальной среде устанавливать не нужно.

Начало работы с Azure Cloud Shell

Параметр Пример и ссылка
Нажмите кнопку Попробовать в правом верхнем углу блока кода или команд. При нажатии кнопки Попробовать код или команда не копируется в Cloud Shell автоматически. Screenshot that shows an example of Try It for Azure Cloud Shell.
Чтобы открыть Cloud Shell в браузере, перейдите по адресу https://shell.azure.com или нажмите кнопку Запуск Cloud Shell. Screenshot that shows how to launch Cloud Shell in a new window.
Нажмите кнопку Cloud Shell в строке меню в правом верхнем углу окна портала Azure. Screenshot that shows the Cloud Shell button in the Azure portal

Чтобы использовать Azure Cloud Shell, выполните следующие действия:

  1. Запустите Cloud Shell.
  2. Нажмите кнопку Копировать в блоке кода (или блоке команд), чтобы скопировать код или команду.
  3. Вставьте код или команду в окно сеанса Cloud Shell, нажав клавиши CTRL+SHIFT+V в Windows и Linux или CMD+SHIFT+V в macOS.
  4. Нажмите клавишу ВВОД, чтобы запустить код или команду.

2. Создание приложения Java

В приглашении Cloud Shell выполните следующую команду Maven, чтобы создать новое веб-приложение с именем helloworld .

mvn archetype:generate "-DgroupId=example.demo" "-DartifactId=helloworld" "-DarchetypeArtifactId=maven-archetype-webapp" "-DarchetypeVersion=1.4" "-Dversion=1.0-SNAPSHOT" 

Затем измените рабочую папку на папку проекта:

cd helloworld 

3. Настройка подключаемого модуля Maven

Процесс развертывания для службы приложение Azure использует учетные данные Azure из Azure CLI автоматически. Если Azure CLI не установлен локально, подключаемый модуль Maven проходит проверку подлинности с помощью OAuth или входа устройства. Дополнительные сведения см. в статье о проверке подлинности с помощью подключаемых модулей Maven.

Выполните команду Maven, показанную рядом с настройкой развертывания. Эта команда помогает настроить Служба приложений операционную систему, версию Java и версию Tomcat.

mvn com.microsoft.azure:azure-webapp-maven-plugin:2.12.0:config 
  1. Для создания конфигурации запуска введите Y и введите ввод.
  2. Для определения значения ос введите 1 для Windows или 2 для Linux, а затем введите.
  3. Для определения значения javaVersion введите 3 для Java 17, а затем введите.
  4. Для определения значения для webContainer введите 1 для Tomcat 10.0 , а затем введите.
  5. Для определения значения для ценообразования введите 9 для P1v2, а затем Введите.
  6. Для подтверждения введите Y и введите ввод.
Please confirm webapp properties AppName : helloworld-1690440759246 ResourceGroup : helloworld-1690440759246-rg Region : centralus PricingTier : P1v2 OS : Linux Java Version: Java 17 Web server stack: Tomcat 10.0 Deploy to slot : false Confirm (Y/N) [Y]: [INFO] Saving configuration to pom. [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 13.069 s [INFO] Finished at: 2023-07-27T06:52:48Z [INFO] ------------------------------------------------------------------------ 

После подтверждения выбора подключаемый модуль добавляет приведенный выше элемент подключаемого модуля и необходимые параметры в файл pom.xml проекта, который позволяет настроить веб-приложение для запуска в Службе приложений Azure.

Соответствующая часть pom.xml файла должна выглядеть примерно так, как показано в следующем примере.

   com.microsoft.azure >azure-webapp-maven-plugin x.xx.x v2 your-resourcegroup-name your-app-name .    

Вы можете изменить другие параметры Службы приложений непосредственно в pom.xml . Некоторые распространенные конфигурации перечислены в следующей таблице:

Свойство Обязательное поле Описание Версия
false Указывает версию схемы конфигурации. Поддерживаемые значения: v1 и v2 . 1.5.2
false Укажите идентификатор подписки. Версия 0.1.0 и выше
true Группа ресурсов Azure для вашего веб-приложения. Версия 0.1.0 и выше
true Название вашего веб-приложения. Версия 0.1.0 и выше
false Указывает регион для размещения веб-приложения; Значение по умолчанию — centralus. Определить допустимые регионы можно в разделе Поддерживаемые регионы. Версия 0.1.0 и выше
false Ценовая категория веб-приложения. Для производственной рабочей нагрузки по умолчанию задано значение P1v2. Вариант B2 является рекомендуемым минимумом для разработки и тестирования в среде Java. Дополнительные сведения см. на странице цен на службу приложений. Версия 0.1.0 и выше
false Конфигурация среды выполнения. Дополнительные сведения см. в разделе Дополнительные сведения о конфигурации. Версия 0.1.0 и выше
false Конфигурация развертывания. Дополнительные сведения см. в разделе Дополнительные сведения о конфигурации. Версия 0.1.0 и выше

Полный список конфигураций см. в справочной документации по подключаемым модулям. Все подключаемые модули Azure Maven используют общий набор конфигураций. Для этих конфигураций см . общие конфигурации. Сведения о конфигурациях, относящихся к Служба приложений, см. в разделе «Веб-приложение Azure: сведения о конфигурации».

Будьте внимательны к значениям и ( helloworld-1690440759246 и helloworld-1690440759246-rg соответственно в демонстрации). Они используются позже.

4. Развертывание приложения

Все конфигурации, готовые к использованию в файле pom.xml, можно развернуть приложение Java в Azure с помощью одной команды.

mvn package azure-webapp:deploy 

После завершения развертывания приложение будет готово http://.azurewebsites.net/ ( http://helloworld-1690440759246.azurewebsites.net в демонстрационной версии). Откройте URL-адрес в своем локальном веб-браузере. Вы должны увидеть следующее:

Screenshot of Maven Hello World web app running in Azure App Service.

Поздравляем! Вы развернули свое первое приложение Java в службе приложений.

5. Очистка ресурсов

На предыдущем шаге вы создали ресурсы Azure в группе ресурсов. Если эти ресурсы вам не понадобятся в будущем, вы можете удалить группу ресурсов из портала, или выполнив приведенную ниже команду в Cloud Shell.

az group delete --name --yes 

Ее выполнение может занять до минуты.

В этом кратком руководстве вы будете использовать подключаемый модуль Maven для службы приложение Azure веб-приложения для развертывания веб-приложения Java с внедренным сервером в службе приложение Azure. Служба приложений предоставляет высокомасштабируемую веб-службу размещения веб-приложений. Используйте вкладки для переключения между инструкциями по Tomcat, JBoss или внедренным серверам (Java SE).

В кратком руководстве используется пример Quarkus, который поставляется с пакетным веб-сервером. Вы можете развернуть собственный пакет приложения и сервера в одном JAR-файле, чтобы Служба приложений вместо использования параметров размещения Tomcat или JBoss. Если вы хотите, можно также внедрить сервер Tomcat в JAR-файл и запустить его в Служба приложений.

Для приложений Spring, требующих всех служб Spring, попробуйте использовать Azure Spring Apps . Однако можно развернуть приложения Spring Boot в Служба приложений.

Screenshot of Maven Hellow World web app running in Azure App Service in introduction.

Если вы не хотите использовать Maven в качестве средства разработки, ознакомьтесь с аналогичными руководствами для разработчиков Java:

Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начинать работу.

1. Использование Azure Cloud Shell

В Azure есть Azure Cloud Shell, интерактивная оболочка среды, с которой можно работать в браузере. Для работы со службами Azure можно использовать Bash или PowerShell с Cloud Shell. Для запуска кода из этой статьи можно использовать предварительно установленные команды Cloud Shell. Ничего дополнительного в локальной среде устанавливать не нужно.

Начало работы с Azure Cloud Shell

Параметр Пример и ссылка
Нажмите кнопку Попробовать в правом верхнем углу блока кода или команд. При нажатии кнопки Попробовать код или команда не копируется в Cloud Shell автоматически. Screenshot that shows an example of Try It for Azure Cloud Shell.
Чтобы открыть Cloud Shell в браузере, перейдите по адресу https://shell.azure.com или нажмите кнопку Запуск Cloud Shell. Screenshot that shows how to launch Cloud Shell in a new window.
Нажмите кнопку Cloud Shell в строке меню в правом верхнем углу окна портала Azure. Screenshot that shows the Cloud Shell button in the Azure portal

Чтобы использовать Azure Cloud Shell, выполните следующие действия:

  1. Запустите Cloud Shell.
  2. Нажмите кнопку Копировать в блоке кода (или блоке команд), чтобы скопировать код или команду.
  3. Вставьте код или команду в окно сеанса Cloud Shell, нажав клавиши CTRL+SHIFT+V в Windows и Linux или CMD+SHIFT+V в macOS.
  4. Нажмите клавишу ВВОД, чтобы запустить код или команду.

2. Создание приложения Java

В приглашении Cloud Shell выполните следующую команду Maven, чтобы создать новое веб-приложение с именем quarkus-hello-azure .

 mvn io.quarkus.platform:quarkus-maven-plugin:3.2.2.Final:create \ -DprojectGroupId=org.acme \ -DprojectArtifactId=quarkus-hello-azure \ -Dextensions='resteasy-reactive' 

Затем измените рабочую папку на папку проекта:

cd quarkus-hello-azure 

3. Настройка подключаемого модуля Maven

Процесс развертывания для службы приложение Azure использует учетные данные Azure из Azure CLI автоматически. Если Azure CLI не установлен локально, подключаемый модуль Maven проходит проверку подлинности с помощью OAuth или входа устройства. Дополнительные сведения см. в статье о проверке подлинности с помощью подключаемых модулей Maven.

Выполните команду Maven, показанную рядом с настройкой развертывания. Эта команда помогает настроить Служба приложений операционную систему, версию Java и версию Tomcat.

mvn com.microsoft.azure:azure-webapp-maven-plugin:2.12.0:config 
  1. Для создания конфигурации запуска введите Y и введите ввод.
  2. Для определения значения ос введите 2 для Linux, а затем введите.
  3. Для определения значения javaVersion введите 1 для Java 17, а затем введите.
  4. Для определения значения для ценообразования введите 9 для P1v2, а затем Введите.
  5. Для подтверждения введите Y и введите ввод.
Please confirm webapp properties AppName : quarkus-hello-azure-1690375364238 ResourceGroup : quarkus-hello-azure-1690375364238-rg Region : centralus PricingTier : P1v2 OS : Linux Java Version: Java 17 Web server stack: Java SE Deploy to slot : false Confirm (Y/N) [Y]: y [INFO] Saving configuration to pom. [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 8.139 s [INFO] Finished at: 2023-07-26T12:42:48Z [INFO] ------------------------------------------------------------------------ 

После подтверждения выбора подключаемый модуль добавляет приведенный выше элемент подключаемого модуля и необходимые параметры в файл pom.xml проекта, который позволяет настроить веб-приложение для запуска в Службе приложений Azure.

Соответствующая часть pom.xml файла должна выглядеть примерно так, как показано в следующем примере.

   com.microsoft.azure >azure-webapp-maven-plugin x.xx.x v2 your-resourcegroup-name your-app-name .    

Вы можете изменить другие параметры Службы приложений непосредственно в pom.xml . Некоторые распространенные конфигурации перечислены в следующей таблице:

Свойство Обязательное поле Описание Версия
false Указывает версию схемы конфигурации. Поддерживаемые значения: v1 и v2 . 1.5.2
false Укажите идентификатор подписки. Версия 0.1.0 и выше
true Группа ресурсов Azure для вашего веб-приложения. Версия 0.1.0 и выше
true Название вашего веб-приложения. Версия 0.1.0 и выше
false Указывает регион для размещения веб-приложения; Значение по умолчанию — centralus. Определить допустимые регионы можно в разделе Поддерживаемые регионы. Версия 0.1.0 и выше
false Ценовая категория веб-приложения. Для производственной рабочей нагрузки по умолчанию задано значение P1v2. Вариант B2 является рекомендуемым минимумом для разработки и тестирования в среде Java. Дополнительные сведения см. на странице цен на службу приложений. Версия 0.1.0 и выше
false Конфигурация среды выполнения. Дополнительные сведения см. в разделе Дополнительные сведения о конфигурации. Версия 0.1.0 и выше
false Конфигурация развертывания. Дополнительные сведения см. в разделе Дополнительные сведения о конфигурации. Версия 0.1.0 и выше

Полный список конфигураций см. в справочной документации по подключаемым модулям. Все подключаемые модули Azure Maven используют общий набор конфигураций. Для этих конфигураций см . общие конфигурации. Сведения о конфигурациях, относящихся к Служба приложений, см. в разделе «Веб-приложение Azure: сведения о конфигурации».

Будьте внимательны к значениям и ( quarkus-hello-azure-1690375364238 и quarkus-hello-azure-1690375364238-rg соответственно в демонстрации). Они используются позже.

4. Развертывание приложения

Все конфигурации, готовые к использованию в файле pom.xml, можно развернуть приложение Java в Azure с помощью одной команды.

    Перестройте JAR-файл с помощью следующей команды:

mvn clean package -Dquarkus.package.type=uber-jar -D%prod.quarkus.http.port=80 
  • quarkus.package.type=uber-jar Сообщает Maven создать Uber-Jar, который включает все зависимости в JAR-файле.
  • %prod.quarkus.http.port=80 Сообщает Quarkus использовать порт 80 для среды prod во время выполнения, который является портом по умолчанию, используемым контейнером Java для Linux. Если вы хотите, можно изменить номер порта контейнера Java с параметром WEBSITES_PORT приложения.

Эти свойства можно настроить с помощью других средств, но они добавлены в mvn package команду здесь для простоты.

mvn azure-webapp:deploy 

Если развертывание выполнено успешно, вы увидите следующие выходные данные:

[INFO] Successfully deployed the artifact to https://quarkus-hello-azure-1690375364238.azurewebsites.net [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 02:20 min [INFO] Finished at: 2023-07-26T12:47:50Z [INFO] ------------------------------------------------------------------------ 

После завершения развертывания приложение будет готово http://.azurewebsites.net/ ( http://quarkus-hello-azure-1690375364238.azurewebsites.net в демонстрационной версии). Откройте URL-адрес в своем локальном веб-браузере. Вы должны увидеть следующее:

Screenshot of Maven Hellow World web app running in Azure App Service.

Поздравляем! Вы развернули свое первое приложение Java в службе приложений.

5. Очистка ресурсов

На предыдущем шаге вы создали ресурсы Azure в группе ресурсов. Если эти ресурсы вам не понадобятся в будущем, вы можете удалить группу ресурсов из портала, или выполнив приведенную ниже команду в Cloud Shell.

az group delete --name --yes 

Ее выполнение может занять до минуты.

В этом кратком руководстве вы будете использовать подключаемый модуль Maven для службы приложение Azure веб-приложения для развертывания веб-приложения Java на сервере JBoss EAP Linux в службе приложение Azure. Служба приложений предоставляет высокомасштабируемую веб-службу размещения веб-приложений. Используйте вкладки для переключения между инструкциями по Tomcat, JBoss или внедренным серверам (Java SE).

Screenshot of Maven Hello World web app running in Azure App Service.

Если вы не хотите использовать Maven в качестве средства разработки, ознакомьтесь с аналогичными руководствами для разработчиков Java:

Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начинать работу.

1. Использование Azure Cloud Shell

В Azure есть Azure Cloud Shell, интерактивная оболочка среды, с которой можно работать в браузере. Для работы со службами Azure можно использовать Bash или PowerShell с Cloud Shell. Для запуска кода из этой статьи можно использовать предварительно установленные команды Cloud Shell. Ничего дополнительного в локальной среде устанавливать не нужно.

Начало работы с Azure Cloud Shell

Параметр Пример и ссылка
Нажмите кнопку Попробовать в правом верхнем углу блока кода или команд. При нажатии кнопки Попробовать код или команда не копируется в Cloud Shell автоматически. Screenshot that shows an example of Try It for Azure Cloud Shell.
Чтобы открыть Cloud Shell в браузере, перейдите по адресу https://shell.azure.com или нажмите кнопку Запуск Cloud Shell. Screenshot that shows how to launch Cloud Shell in a new window.
Нажмите кнопку Cloud Shell в строке меню в правом верхнем углу окна портала Azure. Screenshot that shows the Cloud Shell button in the Azure portal

Чтобы использовать Azure Cloud Shell, выполните следующие действия:

  1. Запустите Cloud Shell.
  2. Нажмите кнопку Копировать в блоке кода (или блоке команд), чтобы скопировать код или команду.
  3. Вставьте код или команду в окно сеанса Cloud Shell, нажав клавиши CTRL+SHIFT+V в Windows и Linux или CMD+SHIFT+V в macOS.
  4. Нажмите клавишу ВВОД, чтобы запустить код или команду.

2. Создание приложения Java

Клонируйте демонстрационное приложение для магазина Pet.

git clone https://github.com/Azure-Samples/app-service-java-quickstart 

Измените каталог на завершенный проект хранилища домашних животных и создайте его.

Для petstore-ee7 примера требуется Java 11 или более поздней версии. Для booty-duke-app-service примера проекта требуется Java 17. Если установленная версия Java меньше 17, запустите сборку из petstore-ee7 каталога, а не на верхнем уровне.

cd app-service-java-quickstart git checkout 20230308 cd petstore-ee7 mvn clean install 

Если появится сообщение об отключенном состоянии HEAD , это сообщение безопасно игнорировать. Так как вы не сделаете фиксацию Git в этом кратком руководстве, отключенное состояние HEAD подходит.

3. Настройка подключаемого модуля Maven

Процесс развертывания для службы приложение Azure использует учетные данные Azure из Azure CLI автоматически. Если Azure CLI не установлен локально, подключаемый модуль Maven проходит проверку подлинности с помощью OAuth или входа устройства. Дополнительные сведения см. в статье о проверке подлинности с помощью подключаемых модулей Maven.

Выполните команду Maven, показанную рядом с настройкой развертывания. Эта команда помогает настроить Служба приложений операционную систему, версию Java и версию Tomcat.

mvn com.microsoft.azure:azure-webapp-maven-plugin:2.12.0:config 
  1. Для создания конфигурации запуска введите Y и введите ввод.
  2. Для определения значения ос введите 2 для Linux, а затем введите.
  3. Для определения значения javaVersion введите 2 для Java 11, а затем введите.
  4. Для параметра webContainer введите 1 для Jbosseap 7, а затем введите.
  5. Для определения значения для ценообразования введите 1 для P1v3, а затем введите.
  6. Для подтверждения введите Y и введите ввод.
Please confirm webapp properties AppName : petstoreee7-1690443003536 ResourceGroup : petstoreee7-1690443003536-rg Region : centralus PricingTier : P1v3 OS : Linux Java Version: Java 11 Web server stack: Jbosseap 7 Deploy to slot : false Confirm (Y/N) [Y]: [INFO] Saving configuration to pom. [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 19.914 s [INFO] Finished at: 2023-07-27T07:30:20Z [INFO] ------------------------------------------------------------------------ 

После подтверждения выбора подключаемый модуль добавляет приведенный выше элемент подключаемого модуля и необходимые параметры в файл pom.xml проекта, который позволяет настроить веб-приложение для запуска в Службе приложений Azure.

Соответствующая часть pom.xml файла должна выглядеть примерно так, как показано в следующем примере.

   com.microsoft.azure >azure-webapp-maven-plugin x.xx.x v2 your-resourcegroup-name your-app-name .    

Вы можете изменить другие параметры Службы приложений непосредственно в pom.xml . Некоторые распространенные конфигурации перечислены в следующей таблице:

Свойство Обязательное поле Описание Версия
false Указывает версию схемы конфигурации. Поддерживаемые значения: v1 и v2 . 1.5.2
false Укажите идентификатор подписки. Версия 0.1.0 и выше
true Группа ресурсов Azure для вашего веб-приложения. Версия 0.1.0 и выше
true Название вашего веб-приложения. Версия 0.1.0 и выше
false Указывает регион для размещения веб-приложения; Значение по умолчанию — centralus. Определить допустимые регионы можно в разделе Поддерживаемые регионы. Версия 0.1.0 и выше
false Ценовая категория веб-приложения. Для производственной рабочей нагрузки по умолчанию задано значение P1v2. Вариант B2 является рекомендуемым минимумом для разработки и тестирования в среде Java. Дополнительные сведения см. на странице цен на службу приложений. Версия 0.1.0 и выше
false Конфигурация среды выполнения. Дополнительные сведения см. в разделе Дополнительные сведения о конфигурации. Версия 0.1.0 и выше
false Конфигурация развертывания. Дополнительные сведения см. в разделе Дополнительные сведения о конфигурации. Версия 0.1.0 и выше

Полный список конфигураций см. в справочной документации по подключаемым модулям. Все подключаемые модули Azure Maven используют общий набор конфигураций. Для этих конфигураций см . общие конфигурации. Сведения о конфигурациях, относящихся к Служба приложений, см. в разделе «Веб-приложение Azure: сведения о конфигурации».

Будьте внимательны к значениям и ( petstoreee7-1690443003536 и petstoreee7-1690443003536-rg соответственно в демонстрации). Они используются позже.

4. Развертывание приложения

Все конфигурации, готовые к использованию в файле pom.xml, можно развернуть приложение Java в Azure с помощью одной команды.

# Disable testing, as it requires Wildfly to be installed locally. mvn package azure-webapp:deploy -DskipTests 

После завершения развертывания приложение будет готово http://.azurewebsites.net/ ( http://petstoreee7-1690443003536.azurewebsites.net в демонстрационной версии). Откройте URL-адрес в своем локальном веб-браузере. Вы должны увидеть следующее:

Screenshot of Maven Hello World web app running in Azure App Service.

Поздравляем! Вы развернули свое первое приложение Java в службе приложений.

5. Очистка ресурсов

На предыдущем шаге вы создали ресурсы Azure в группе ресурсов. Если эти ресурсы вам не понадобятся в будущем, вы можете удалить группу ресурсов из портала, или выполнив приведенную ниже команду в Cloud Shell.

az group delete --name --yes 

Ее выполнение может занять до минуты.

Приложение Spring Boot как услуга

В этой статье рассматриваются некоторые варианты запуска приложений Spring Boot в качестве службы.

Во-первых, мы собираемся объяснить варианты упаковки веб-приложений и системные службы. В последующих разделах мы рассмотрим различные альтернативы, которые у нас есть при настройке службы как для Linux, так и для систем на базе Windows.

Наконец, мы закончим некоторыми ссылками на дополнительные источники информации.

2. Инструкции по установке и сборке проекта

2.1. Упаковка

Веб-приложения традиционно упаковываются в архивы веб-приложений (WAR) и развертываются на веб-сервере.

Приложения Spring Boot могут быть упакованы как в файлы WAR, так и в файлы JAR. Последний встраивает веб-сервер в файл JAR, что позволяет запускать приложения без необходимости установки и настройки сервера приложений.

2.2. Конфигурация Maven

Начнем с определения конфигурации нашего файла pom.xml :

 packaging>jarpackaging>    parent>   groupId>org.springframework.bootgroupId>   artifactId>spring-boot-starter-parentartifactId>   version>1.4.0.RELEASEversion>   parent>    dependencies>   .   dependencies>    build>   plugins>   plugin>   groupId>org.springframework.bootgroupId>   artifactId>spring-boot-maven-pluginartifactId>   configuration>   executable>trueexecutable>   configuration>   plugin>   plugins>   build> 

Упаковка должна быть установлена на jar . Мы используем последнюю стабильную версию Spring Boot на момент написания, но будет достаточно любой версии после 1.3. Вы можете найти больше информации о доступных версиях здесь .

Обратите внимание, что мы установили для параметра значение true для артефакта spring-boot-maven-plugin . Это гарантирует, что файл MANIFEST.MF будет добавлен в пакет JAR. Этот манифест содержит запись Main-Class , указывающую, какой класс определяет основной метод для вашего приложения.

2.3. Создание вашего приложения

Запустите следующую команду в корневом каталоге вашего приложения:

 $ mvn clean package 

Исполняемый файл JAR теперь доступен в целевом каталоге, и мы можем запустить приложение, выполнив следующую команду в командной строке:

 $ java -jar your-app.jar 

На этом этапе вам все еще нужно вызвать интерпретатор Java с параметром -jar . Есть много причин, по которым было бы предпочтительнее запускать приложение, имея возможность вызывать его как службу.

3. В Linux

Чтобы запустить программу как фоновый процесс, мы могли бы просто использовать команду nohup Unix, но это также не является предпочтительным способом по разным причинам. В этой теме есть хорошее объяснение .

Вместо этого мы собираемся демонизировать наш процесс. В Linux мы можем настроить демон либо с помощью традиционного сценария инициализации System V , либо с помощью файла конфигурации Systemd . Первый традиционно является наиболее известным вариантом, но постепенно вытесняется вторым.

Вы можете найти более подробную информацию об этой разнице здесь .

Для повышения безопасности мы сначала создаем конкретного пользователя для запуска службы и соответствующим образом меняем права доступа к исполняемому JAR-файлу:

 $ sudo useradd foreach $ sudo passwd foreach $ sudo chown foreach:foreach your-app.jar $ sudo chmod 500 your-app.jar 

3.1. Инициализация системы V

Исполняемый JAR-файл Spring Boot упрощает процесс настройки службы:

 $ sudo ln -s /path/to/your-app.jar /etc/init.d/your-app 

Приведенная выше команда создает символическую ссылку на ваш исполняемый файл JAR. Вы должны использовать полный путь к исполняемому файлу JAR, иначе символическая ссылка не будет работать должным образом. Эта ссылка позволяет запустить приложение как службу:

 $ sudo service your-app start 

Скрипт поддерживает стандартные команды запуска , остановки , перезапуска и состояния службы . Более того:

  • он запускает службы, работающие под только что созданным пользователем foreach
  • он отслеживает идентификатор процесса приложения в /var/run/your-app/your-app.pid
  • он записывает журналы консоли в /var/log/your-app.log , которые вы можете проверить на случай, если ваше приложение не запустится должным образом.

3.2. Системд

Настройка службы systemd также очень проста. Во- первых, мы создаем скрипт с именем your-app.service, используя следующий пример, и помещаем его в каталог /etc/systemd/system :

[Unit] Description=A Spring Boot application After=syslog.target [Service] User=foreach ExecStart=/path/to/your-app.jar SuccessExitStatus=143 [Install] WantedBy=multi-user.target 

Не забудьте изменить поля Description , User и ExecStart , чтобы они соответствовали вашему приложению. На этом этапе вы также сможете выполнять вышеупомянутые стандартные служебные команды.

В отличие от подхода к инициализации System V , описанного в предыдущем разделе, файл идентификатора процесса и файл журнала консоли должны быть настроены явно с использованием соответствующих полей в сценарии службы. Исчерпывающий список опций можно найти здесь .

3.3. Выскочка

Upstart — это диспетчер служб на основе событий, потенциальная замена System V init , который предлагает больший контроль над поведением различных демонов.

На сайте есть хорошие инструкции по установке , которые подойдут практически для любого дистрибутива Linux. При использовании Ubuntu вы, вероятно, уже установили и настроили его (проверьте, есть ли какие-либо задания с именем, начинающимся с «upstart» в /etc/init ).

Мы создаем задание your-app.conf для запуска нашего приложения Spring Boot:

# Place in /home//.config/upstart description "Some Spring Boot application" respawn # attempt service restart if stops abruptly exec java -jar /path/to/your-app.jar 

Теперь запустите «start your-app», и ваш сервис запустится.

Upstart предлагает множество вариантов настройки работы, большинство из них вы можете найти здесь .

4. В Windows

В этом разделе мы представляем несколько вариантов, которые можно использовать для запуска Java JAR в качестве службы Windows.

4.1. Оболочка службы Windows

Из-за трудностей с лицензией GPL Java Service Wrapper (см. следующий подраздел) в сочетании, например, с лицензией MIT Jenkins , был задуман проект Windows Service Wrapper , также известный как winsw .

Winsw предоставляет программные средства для установки/удаления/запуска/остановки службы. Кроме того, его можно использовать для запуска любого исполняемого файла в качестве службы под Windows, тогда как Java Service Wrapper, как следует из его названия, поддерживает только приложения Java.

Во-первых, вы скачиваете бинарники здесь . Затем файл конфигурации, определяющий нашу службу Windows, MyApp.xml , должен выглядеть так:

  MyApp  MyApp  This runs Spring Boot as a Service.    java  -Xmx256m -jar "%BASE%\MyApp.jar"  rotate 

Наконец, вы должны переименовать winsw.exe в MyApp.exe , чтобы его имя совпадало с файлом конфигурации MyApp.xml . После этого вы можете установить службу следующим образом:

$ MyApp.exe install 

Точно так же вы можете использовать uninstall , start , stop и т. д.

4.2. Оболочка службы Java

Если вы не возражаете против лицензирования GPL проекта Java Service Wrapper , эта альтернатива может одинаково хорошо удовлетворить ваши потребности в настройке файла JAR в качестве службы Windows. По сути, Java Service Wrapper также требует, чтобы вы указали в файле конфигурации, который указывает, как запускать ваш процесс как службу в Windows.

В этой статье очень подробно объясняется, как настроить выполнение JAR-файла в качестве службы в Windows, поэтому нам нет необходимости повторять информацию.

5. Дополнительные ссылки

Приложения Spring Boot также можно запускать как службу Windows с помощью Procrun проекта Apache Commons Daemon . Procrun — это набор приложений, которые позволяют пользователям Windows превращать приложения Java в службы Windows. Такая служба может быть настроена на автоматический запуск при загрузке машины и будет продолжать работать без входа пользователя в систему.

Более подробную информацию о запуске приложений Spring Boot под Unix можно найти здесь . Также есть подробные инструкции по изменению файлов модулей Systemd для систем на основе Redhat. Окончательно

Наконец, это краткое руководство описывает, как включить сценарий Bash в ваш файл JAR, чтобы он сам стал исполняемым файлом!

6. Заключение

Сервисы позволяют вам очень эффективно управлять состоянием вашего приложения, и, как мы видели, настройка сервисов для приложений Spring Boot теперь проще, чем когда-либо.

Просто не забудьте следовать важным и простым мерам безопасности в отношении разрешений пользователей на запуск вашего сервиса.

Установка приложения Java в качестве службы Windows

Это звучит как то, что вам никогда не понадобится, но иногда, когда вы распространяете программное обеспечение для конечного пользователя, вам может потребоваться установить Java-программу в качестве службы Windows. Мне пришлось это сделать, потому что я разработал инструмент для государственных служащих, который автоматически конвертирует и передает свои файлы Excel на портал opendata своей страны. Инструмент должен периодически запускаться, поэтому он является основным кандидатом на услугу (что сделает загрузку возможной, даже если государственный служащий вообще забудет об этой задаче, и, кроме того, повторная загрузка вручную – пустая трата времени).

Несмотря на многочисленные сообщения и ответы на вопросы stackoverflow по этой теме, мне все равно потребовалось много времени из-за незначительных предостережений и одного важного условия, которое, казалось, имели немногие – наличие JRE в комплекте, так что никто не должен загружать и устанавливать JRE (усложнит процесс установки без необходимости, а целевая аудитория не обязательно будет разбираться в технологиях).

Итак, в проекте maven с jar-упаковкой я сначала подумал об упаковке exe- файла (с launch4j ), а затем о регистрации его в качестве службы. Проблема в том, что Java-программа использует запланированный исполнитель, поэтому она никогда не завершается, что делает невозможным запуск ее как процесса.

Поэтому мне пришлось «демонизировать» его, используя procrun для commons-daemon . Перед этим мне пришлось собрать все необходимые компоненты в одну целевую папку – толстый файл jar (включая все зависимости), JRE, двоичные файлы commons-daemon и файл конфигурации.

Вы можете увидеть полный файл Maven здесь . Соответствующие биты (где $ равен $/target/installer> ):

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *