«1. Обзор

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

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

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

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

2.1. Упаковка

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

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

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

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

<packaging>jar</packaging>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.0.RELEASE</version>
</parent>

<dependencies>
    ....
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <executable>true</executable>
            </configuration>
        </plugin>
    </plugins>
</build>

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

Обратите внимание, что мы установили для параметра \u003cexecutable\u003e значение 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 baeldung
$ sudo passwd baeldung
$ sudo chown baeldung:baeldung your-app.jar
$ sudo chmod 500 your-app.jar

3.1. System V Init

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

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

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

$ sudo service your-app start

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

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

3.2. Systemd

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

[Unit]
Description=A Spring Boot application
After=syslog.target

[Service]
User=baeldung
ExecStart=/path/to/your-app.jar SuccessExitStatus=143 

[Install] 
WantedBy=multi-user.target

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

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

3.3. Upstart

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

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

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

# Place in /home/{user}/.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 Service Wrapper

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

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

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

<service>
    <id>MyApp</id>
    <name>MyApp</name>
    <description>This runs Spring Boot as a Service.</description>
    <env name="MYAPP_HOME" value="%BASE%"/>
    <executable>java</executable>
    <arguments>-Xmx256m -jar "%BASE%\MyApp.jar"</arguments>
    <logmode>rotate</logmode>
</service>

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

$ MyApp.exe install

Аналогичным образом вы можете использовать удаление, запуск, остановку и т. д.

4.2. Java Service Wrapper

В случае, если вы не возражаете против лицензирования 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 теперь проще, чем когда-либо.

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