Spring Загрузка приложения как службы
Как настроить красиво Spring Загружаемое приложение, упакованное как исполняемый банку как Служба в Linux-системе? Является ли этот рекомендуемый подход или мне нужно преобразовать это приложение в войну и установить в Tomcat?
В настоящее время я могу запустить приложение загрузки Spring из сеанса screen
, что приятно, но требует ручного запуска после перезагрузки сервера.
Я ищу общий совет/направление или образец init.d
script, если мой подход с исполняемым банком является правильным.
Ответы
Ответ 1
Следующие работы для Springboot 1.3 и выше:
В качестве службы init.d
Исполняемый файл jar содержит обычные команды start, stop, restart и status. Он также настроит PID файл в обычном каталоге /var/run и войдет в обычный каталог /var/log по умолчанию.
Вам просто нужно вставить символическую ссылку в /etc/init.d примерно так
sudo link -s /var/myapp/myapp.jar /etc/init.d/myapp
ИЛИ
sudo ln -s ~/myproject/build/libs/myapp-1.0.jar /etc/init.d/myapp_servicename
После этого вы можете сделать обычный
/etc/init.d/myapp start
Затем установите ссылку в зависимости от того, какой уровень запуска вы хотите, чтобы приложение запускалось/останавливалось при загрузке, если это необходимо.
В качестве системного сервиса
Чтобы запустить приложение Spring Boot, установленное в var/myapp, вы можете добавить следующий скрипт в /etc/systemd/system/myapp.service:
[Unit]
Description=myapp
After=syslog.target
[Service]
ExecStart=/var/myapp/myapp.jar
[Install]
WantedBy=multi-user.target
Примечание: если вы используете этот метод, не забудьте сделать сам файл jar исполняемым (с помощью chmod +x), иначе он завершится с ошибкой "Отказано в доступе".
Ссылка
http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/html/deployment-install.html#deployment-service
Ответ 2
Далее следует самый простой способ установить приложение Java в качестве системной службы в Linux.
Предположим, что вы используете systemd
(что сегодня делает любой современный дистрибутив):
Во-первых, создайте файл службы в /etc/systemd/system
с именем, например. javaservice.service
с таким содержанием:
[Unit]
Description=Java Service
[Service]
User=nobody
# The configuration file application.properties should be here:
WorkingDirectory=/data
ExecStart=/usr/bin/java -Xmx256m -jar application.jar --server.port=8081
SuccessExitStatus=143
TimeoutStopSec=10
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
Во-вторых, уведомите systemd
о новом файле сервиса:
systemctl daemon-reload
и включите его, чтобы он работал при загрузке:
systemctl enable javaservice.service
В конце концов вы можете использовать следующие команды для запуска/остановки новой службы:
systemctl start javaservice
systemctl stop javaservice
systemctl restart javaservice
systemctl status javaservice
При условии, что вы используете systemd
, это самый ненавязчивый и чистый способ настроить приложение Java в качестве системной службы.
Что мне особенно нравится в этом решении, так это то, что вам не нужно устанавливать и настраивать любое другое программное обеспечение. Поставленный systemd
делает всю работу за вас, и ваш сервис ведет себя как любой другой системный сервис. Я использую его некоторое время в разных дистрибутивах, и он работает так, как вы ожидаете.
Еще один плюс заключается в том, что с помощью /usr/bin/java
вы можете легко добавлять параметры jvm
, такие как -Xmx256m
.
Также прочитайте часть systemd
в официальной документации Spring Boot:http://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html
Ответ 3
Вы также можете использовать supervisord, который является очень удобным демоном, который может использоваться для управления службами. Эти службы определяются простыми файлами конфигурации, определяющими, что нужно выполнять с каким пользователем, в каком каталоге и т.д., Есть множество вариантов. superisord имеет очень простой синтаксис, поэтому он делает очень хорошую альтернативу написанию сценариев инициализации SysV.
Вот простой конфигурационный файл superisord для программы, которую вы пытаетесь запустить/управлять. (поместите это в /etc/supervisor/conf.d/yourapp.conf)
/etc/supervisor/conf.d/yourapp.conf
[program:yourapp]
command=/usr/bin/java -jar /path/to/application.jar
user=usertorun
autostart=true
autorestart=true
startsecs=10
startretries=3
stdout_logfile=/var/log/yourapp-stdout.log
stderr_logfile=/var/log/yourapp-stderr.log
Чтобы управлять приложением, вам нужно выполнить supervisorctl, который предоставит вам приглашение, в котором вы могли бы запустить, остановить, статус yourapp.
CLI
# sudo supervisorctl
yourapp RUNNING pid 123123, uptime 1 day, 15:00:00
supervisor> stop yourapp
supervisor> start yourapp
Если демон supervisord
уже запущен, и вы добавили конфигурацию для своего serivce без перезапуска демона, вы можете просто выполнить команду reread
и update
в оболочке supervisorctl
.
Это действительно дает вам все гибкие возможности, которые вы бы использовали с помощью скриптов SysV Init, но прост в использовании и управлении. Взгляните на документацию.
Ответ 4
Я просто обошел это самостоятельно, поэтому следующее: я до сих пор имею в виду сервис-контроллер CentOS init.d script. До сих пор это работало довольно хорошо, но я не хакер, но я уверен, что есть место для улучшения, поэтому мысли о его улучшении приветствуются.
Прежде всего, у меня есть короткая конфигурация script /data/svcmgmt/conf/my-spring-boot-api.sh
для каждой службы, которая устанавливает переменные среды.
#!/bin/bash
export JAVA_HOME=/opt/jdk1.8.0_05/jre
export APP_HOME=/data/apps/my-spring-boot-api
export APP_NAME=my-spring-boot-api
export APP_PORT=40001
Я использую CentOS, поэтому для обеспечения запуска моих сервисов после перезапуска сервера у меня есть служебный элемент управления script в /etc/init.d/my-spring-boot-api
:
#!/bin/bash
# description: my-spring-boot-api start stop restart
# processname: my-spring-boot-api
# chkconfig: 234 20 80
. /data/svcmgmt/conf/my-spring-boot-api.sh
/data/svcmgmt/bin/spring-boot-service.sh $1
exit 0
Как вы можете видеть, это вызывает начальную конфигурацию script для настройки переменных среды, а затем вызывает общий script, который я использую для перезапуска всех моих сервисов загрузки Spring. Этот общий script находится там, где можно найти мясо всего:
#!/bin/bash
echo "Service [$APP_NAME] - [$1]"
echo " JAVA_HOME=$JAVA_HOME"
echo " APP_HOME=$APP_HOME"
echo " APP_NAME=$APP_NAME"
echo " APP_PORT=$APP_PORT"
function start {
if pkill -0 -f $APP_NAME.jar > /dev/null 2>&1
then
echo "Service [$APP_NAME] is already running. Ignoring startup request."
exit 1
fi
echo "Starting application..."
nohup $JAVA_HOME/bin/java -jar $APP_HOME/$APP_NAME.jar \
--spring.config.location=file:$APP_HOME/config/ \
< /dev/null > $APP_HOME/logs/app.log 2>&1 &
}
function stop {
if ! pkill -0 -f $APP_NAME.jar > /dev/null 2>&1
then
echo "Service [$APP_NAME] is not running. Ignoring shutdown request."
exit 1
fi
# First, we will try to trigger a controlled shutdown using
# spring-boot-actuator
curl -X POST http://localhost:$APP_PORT/shutdown < /dev/null > /dev/null 2>&1
# Wait until the server process has shut down
attempts=0
while pkill -0 -f $APP_NAME.jar > /dev/null 2>&1
do
attempts=$[$attempts + 1]
if [ $attempts -gt 5 ]
then
# We have waited too long. Kill it.
pkill -f $APP_NAME.jar > /dev/null 2>&1
fi
sleep 1s
done
}
case $1 in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
esac
exit 0
При остановке он попытается использовать Spring Boot Actuator для выполнения управляемого выключения. Однако в случае, если Actuator не настроен или не завершен в течение разумного временного интервала (я даю ему 5 секунд, что на самом деле немного короче), процесс будет убит.
Кроме того, script делает предположение, что процесс java, выполняющий приложение, будет единственным с "my- spring -boot-api.jar" в тексте деталей процесса. Это безопасное предположение в моей среде и означает, что мне не нужно отслеживать PID.
Ответ 5
Если вы хотите использовать Spring Boot 1.2.5 с Spring Boot Maven Plugin 1.3.0.M2, вот это решение:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.2.5.RELEASE</version>
</parent>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.3.0.M2</version>
<configuration>
<executable>true</executable>
</configuration>
</plugin>
</plugins>
</build>
<pluginRepositories>
<pluginRepository>
<id>spring-libs-milestones</id>
<url>http://repo.spring.io/libs-milestone</url>
</pluginRepository>
</pluginRepositories>
Затем скомпилируйте как ususal: mvn clean package
, создайте символическую ссылку ln -s /.../myapp.jar /etc/init.d/myapp
, сделайте ее выполнимой chmod +x /etc/init.d/myapp
и запустите ее service myapp start
(с сервером Ubuntu)
Ответ 6
Я знаю, что это старый вопрос, но я хотел представить еще один способ, который является appassembler-maven-plugin. Здесь соответствующая часть из моего ПОМ, которая включает в себя множество дополнительных значений параметров, которые мы сочли полезными:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>appassembler-maven-plugin</artifactId>
<configuration>
<generateRepository>true</generateRepository>
<repositoryLayout>flat</repositoryLayout>
<useWildcardClassPath>true</useWildcardClassPath>
<includeConfigurationDirectoryInClasspath>true</includeConfigurationDirectoryInClasspath>
<configurationDirectory>config</configurationDirectory>
<target>${project.build.directory}</target>
<daemons>
<daemon>
<id>${installer-target}</id>
<mainClass>${mainClass}</mainClass>
<commandLineArguments>
<commandLineArgument>--spring.profiles.active=dev</commandLineArgument>
<commandLineArgument>--logging.config=${rpmInstallLocation}/config/${installer-target}-logback.xml</commandLineArgument>
</commandLineArguments>
<platforms>
<platform>jsw</platform>
</platforms>
<generatorConfigurations>
<generatorConfiguration>
<generator>jsw</generator>
<includes>
<include>linux-x86-64</include>
</includes>
<configuration>
<property>
<name>wrapper.logfile</name>
<value>logs/${installer-target}-wrapper.log</value>
</property>
<property>
<name>wrapper.logfile.maxsize</name>
<value>5m</value>
</property>
<property>
<name>run.as.user.envvar</name>
<value>${serviceUser}</value>
</property>
<property>
<name>wrapper.on_exit.default</name>
<value>RESTART</value>
</property>
</configuration>
</generatorConfiguration>
</generatorConfigurations>
<jvmSettings>
<initialMemorySize>256M</initialMemorySize>
<maxMemorySize>1024M</maxMemorySize>
<extraArguments>
<extraArgument>-server</extraArgument>
</extraArguments>
</jvmSettings>
</daemon>
</daemons>
</configuration>
<executions>
<execution>
<id>generate-jsw-scripts</id>
<phase>package</phase>
<goals>
<goal>generate-daemons</goal>
</goals>
</execution>
</executions>
</plugin>
Ответ 7
КАК СЛУЖБА ОКНА
Если вы хотите, чтобы это работало в машине Windows, загрузите winsw.exe из
http://repo.jenkins-ci.org/releases/com/sun/winsw/winsw/2.1.2/
После этого переименуйте его в jar filename (например: your-app.jar)
winsw.exe -> your-app.exe
Теперь создайте XML файл your-app.xml и скопируйте в него следующее содержимое.
<?xml version="1.0" encoding="UTF-8"?>
<service>
<id>your-app</id>
<name>your-app</name>
<description>your-app as a Windows Service</description>
<executable>java</executable>
<arguments>-jar "your-app.jar"</arguments>
<logmode>rotate</logmode>
</service>
Убедитесь, что exe и xml вместе с jar в одной папке.
После этого откройте командную строку в Администраторе и установите ее в службу Windows.
your-app.exe install
eg -> D:\Springboot\your-app.exe install
Если это не с
Error: Registry key 'Software\JavaSoft\Java Runtime Environment'\CurrentVersion' has value '1.8', but '1.7' is required.
Затем попробуйте следующее:
Delete java.exe, javaw.exe and javaws.exe from C:\Windows\System32
вот и все :).
Чтобы удалить службу в Windows
your-app.exe uninstall
Для просмотра/запуска/остановки службы: win + r и введите Администрирование, затем выберите службу из этого. Затем щелкните правой кнопкой мыши, выберите опцию - запустить/остановить
Ответ 8
Мой SysVInit script для Centos 6/RHEL (еще не идеальный). Для этого script требуется ApplicationPidListener.
Источник /etc/init.d/app
#!/bin/sh
#
# app Spring Boot Application
#
# chkconfig: 345 20 80
# description: App Service
#
### BEGIN INIT INFO
# Provides: App
# Required-Start: $local_fs $network
# Required-Stop: $local_fs $network
# Default-Start: 3 4 5
# Default-Stop: 0 1 2 6
# Short-Description: Application
# Description:
### END INIT INFO
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
exec="/usr/bin/java"
prog="app"
app_home=/home/$prog/
user=$prog
[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog
lockfile=/var/lock/subsys/$prog
pid=$app_home/$prog.pid
start() {
[ -x $exec ] || exit 5
[ -f $config ] || exit 6
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 1
echo -n $"Starting $prog: "
cd $app_home
daemon --check $prog --pidfile $pid --user $user $exec $app_args &
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc -p $pid $prog
retval=$?
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
stop
start
}
reload() {
restart
}
force_reload() {
restart
}
rh_status() {
status -p $pid $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
restart
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
exit 2
esac
exit $?
Пример конфигурационного файла /etc/sysconfig/app
:
exec=/opt/jdk1.8.0_05/jre/bin/java
user=myuser
app_home=/home/mysuer/
app_args="-jar app.jar"
pid=$app_home/app.pid
Ответ 9
Вот script, который развертывает исполняемую банку как службу systemd.
Он создает пользователя для службы и файла .service и помещает файл jar в /var и делает некоторые основные блокировки привилегий.
#!/bin/bash
# Argument: The jar file to deploy
APPSRCPATH=$1
# Argument: application name, no spaces please, used as folder name under /var
APPNAME=$2
# Argument: the user to use when running the application, may exist, created if not exists
APPUSER=$3
# Help text
USAGE="
Usage: sudo $0 <jar-file> <app-name> <runtime-user>
If an app with the name <app-name> already exist, it is stopped and deleted.
If the <runtime-user> does not already exist, it is created.
"
# Check that we are root
if [ ! "root" = "$(whoami)" ]; then
echo "Must be root. Please use e.g. sudo"
echo "$USAGE"
exit
fi
# Check arguments
if [ "$#" -ne 3 -o ${#APPSRCPATH} = 0 -o ${#APPNAME} = 0 -o ${#APPUSER} = 0 ]; then
echo "Incorrect number of parameters."
echo "$USAGE"
exit
fi
if [ ! -f $APPSRCPATH ]; then
echo "Can't find jar file $APPSRCPATH"
echo "$USAGE"
exit
fi
# Infered values
APPFILENAME=$(basename $APPSRCPATH)
APPFOLDER=/var/javaapps/$APPNAME
APPDESTPATH=$APPFOLDER/$APPFILENAME
# Stop the service if it already exist and is running
systemctl stop $APPNAME >/dev/null 2>&1
# Create the app folder, deleting any previous content
rm -fr $APPFOLDER
mkdir -p $APPFOLDER
# Create the user if it does not exist
if id "$APPUSER" >/dev/null 2>&1; then
echo "Using existing user $APPUSER"
else
adduser --disabled-password --gecos "" $APPUSER
echo "Created user $APPUSER"
fi
# Place app in app folder, setting owner and rights
cp $APPSRCPATH $APPDESTPATH
chown $APPUSER $APPDESTPATH
chmod 500 $APPDESTPATH
echo "Added or updated the $APPDESTPATH file"
# Create the .service file used by systemd
echo "
[Unit]
Description=$APPNAME
After=syslog.target
[Service]
User=$APPUSER
ExecStart=/usr/bin/java -jar $APPDESTPATH
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
" > /etc/systemd/system/$APPNAME.service
echo "Created the /etc/systemd/system/$APPNAME.service file"
# Reload the daemon
systemctl daemon-reload
# Start the deployed app
systemctl start $APPNAME
systemctl status $APPNAME
Пример:
![введите описание изображения здесь]()
Ответ 10
Я пытаюсь сделать приложения Springboot, которые представлены как оболочка стиля "init.d" script со сжатым java-приложением, прикрепленным к концу
Обозначив эти сценарии из /etc/init.d/ spring-app в/opt/spring-app.jar и chmod'ing, чтобы исполняемый файл мог быть выполнен, можно сделать "/etc/init.d/spring -app start" "/etc/init.d/spring-app stop" и другие возможности, такие как работа статуса
Предположительно, поскольку скрипты стиля init.d из springboot выглядят так, что у них есть необходимые магические строки (например, # Default-Start: 2 3 4 5
), chkconfig сможет добавить его как "сервис"
Но я хотел заставить его работать с systemd
Чтобы выполнить эту работу, я попробовал многие из ответов в других ответах выше, но никто из них не работал у меня на Centos 7.2 с помощью Springboot 1.3. В основном они запускали службу, но не могли отслеживать pid
В конце концов, я обнаружил, что для меня работали, когда была установлена ссылка/etc/init.d. Файл, аналогичный приведенному ниже, должен быть установлен как /usr/lib/systemd/system/spring-app.service
[Unit]
Description=My loverly application
After=syslog.target
[Service]
Type=forking
PIDFile=/var/run/spring-app/spring-app.pid
ExecStart=/etc/init.d/spring-app start
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
Ответ 11
Я закончил тем, что делал обслуживание systemd для разметки WAR/JAR
Я звоню в java -jar, потому что она более гибкая. Попытался также положить ExecStart = spring-mvc.war, но, несмотря на то, что это исполняемый файл, я получил "Ошибка формата Exec"
В любом случае, systemd присутствует во всех дистрибутивах и предлагает отличное решение для перенаправления журналов (syserr важен, когда ваша служба даже не запускает, местоположение файла log4j будет пустым :)).
cat /etc/systemd/system/spring-mvc.service
[Unit]
Description=Spring MVC Java Service
[Service]
User=spring-mvc
# The configuration file application.properties should be here:
WorkingDirectory=/usr/local/spring-mvc
# Run ExecStartPre with root-permissions
PermissionsStartOnly=true
ExecStartPre=-/bin/mkdir -p /var/log/spring-mvc
ExecStartPre=/bin/chown -R spring-mvc:syslog /var/log/spring-mvc
ExecStartPre=/bin/chmod -R 775 /var/log/spring-mvc
#https://www.freedesktop.org/software/systemd/man/systemd.service.html#ExecStart=
ExecStart=/usr/bin/java \
-Dlog4j.configurationFile=log4j2-spring.xml \
-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector \
-Dspring.profiles.active=dev \
-Denvironment-type=dev \
-XX:+UseConcMarkSweepGC \
-XX:CMSInitiatingOccupancyFraction=80 \
-XX:NewSize=756m \
-XX:MetaspaceSize=256m \
-Dsun.net.inetaddr.ttl=5 \
-Xloggc:/var/log/spring-mvc/gc.log \
-verbose:gc \
-verbosegc \
-XX:+DisableExplicitGC \
-XX:+PrintGCDetails \
-XX:+PrintGCDateStamps \
-XX:+PreserveFramePointer \
-XX:+StartAttachListener \
-Xms1024m \
-Xmx1024m \
-XX:+HeapDumpOnOutOfMemoryError \
-jar spring-mvc.war
SuccessExitStatus=143
StandardOutput=journal
StandardError=journal
KillSignal=SIGINT
TimeoutStopSec=20
Restart=always
RestartSec=5
StartLimitInterval=0
StartLimitBurst=10
LimitNOFILE=500000
LimitNPROC=500000
#https://www.freedesktop.org/software/systemd/man/systemd.exec.html#LimitCPU=
#LimitCPU=, LimitFSIZE=, LimitDATA=, LimitSTACK=, LimitCORE=, LimitRSS=, LimitNOFILE=, LimitAS=, LimitNPROC=, LimitMEMLOCK=, LimitLOCKS=, LimitSIGPENDING=, LimitMSGQUEUE=, LimitNICE=, LimitRTPRIO=, LimitRTTIME=¶
SyslogIdentifier=spring-mvc
[Install]
WantedBy=multi-user.target
# https://www.freedesktop.org/software/systemd/man/journalctl.html
#check logs --- journalctl -u spring-mvc -f -o cat
rsyslog - перенаправить ввод системного журнала из приложения в определенную папку/файл
cat /etc/rsyslog.d/30-spring-mvc.conf
if $programname == 'spring-mvc' then /var/log/spring-mvc/spring-mvc.log
& stop
Logrotate
cat /etc/logrotate.d/spring-mvc.conf
/var/log/spring-mvc/spring-mvc.log
{
daily
rotate 30
maxage 30
copytruncate
missingok
notifempty
compress
dateext
dateformat _%Y-%m-%d_%H-%M
delaycompress
create 644 spring-mvc syslog
su spring-mvc syslog
}
войти gc
cat /etc/logrotate.d/spring-mvc-gc.conf
/var/log/spring-mvc/gc.log
{
daily
rotate 30
maxage 30
copytruncate
missingok
notifempty
compress
dateext
dateformat _%Y-%m-%d_%H-%M
delaycompress
create 644 spring-mvc syslog
su spring-mvc syslog
}
Ответ 12
В этом вопросе ответ от @PbxMan должен начать с вас:
Запуск приложения Java как службы в Linux
Edit:
Существует еще один, менее приятный способ начать процесс при перезагрузке, используя cron:
@reboot user-to-run-under /usr/bin/java -jar /path/to/application.jar
Это работает, но не дает вам приятного интерфейса запуска/остановки для вашего приложения. Вы все равно можете просто kill
в любом случае...
Ответ 13
Я не знаю об "стандартном" сжатом способе сделать это с помощью приложения Java, но это определенно хорошая идея (вы хотите воспользоваться возможностями поддержания работоспособности и мониторинга операционной системы, если они здесь). Это на дорожной карте, чтобы обеспечить что-то из поддержки Spring Boot tool (maven и gradle), но пока вам, вероятно, придется сворачивать самостоятельно. Лучшее решение, которое я знаю прямо сейчас, это Foreman, который имеет декларативный подход и одну строку для упаковки сценариев инициализации для различных стандартных ОС форматы (monit, sys V, upstart и т.д.). Есть также свидетельства того, что люди установили вещи с gradle (например, здесь).
Ответ 14
Вы используете Maven? Затем вы должны попробовать плагин AppAssembler:
Плагин Application Assembler - плагин Maven для создания скриптов для запуска java-приложений.... Все артефакты (зависимости + артефакт из проекта) добавляются в путь к классам в сгенерированных сценариях bin.
Поддерживаемые платформы:
Unix-варианта
Windows NT (Windows 9x НЕ поддерживается)
Java Wrapper (JSW)
Смотрите: http://mojo.codehaus.org/appassembler/appassembler-maven-plugin/index.html
Ответ 15
Это можно сделать с помощью сервиса Systemd в Ubuntu.
[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
Вы можете перейти по этой ссылке для более подробного описания и различных способов сделать это. http://www.baeldung.com/spring-boot-app-as-a-service
Ответ 16
В ответ на превосходный ответ Чада, если вы получаете сообщение об ошибке "Ошибка: не удалось найти или загрузить основной класс" - и вы потратите пару часов на его устранение, будь то выполнение сценария оболочки, запускающего ваше Java-приложение, или запуск его из самого systemd - и вы знаете, что ваш classpath является на 100% правильным, например, запуск сценария оболочки вручную работает так же, как и запуск того, что есть в systemd execstart. Убедитесь, что вы работаете как правильный пользователь! В моем случае я пробовал разных пользователей, после долгого времени устранения неполадок - у меня наконец-то появилась догадка, поставил root как пользователь - вуаля, приложение запустилось правильно. Определив, что это была неправильная проблема с пользователем, я chown -R user:user
для папки и подпапок, и приложение работало правильно, как указанные пользователь и группа, поэтому больше не нужно запускать его как root (плохая защита).
Ответ 17
В системных файлах systemd вы можете установить каталог переменных среды или через EnvironmentFile
. Я бы предложил действовать таким образом, так как это кажется наименьшим трением.
Пример файла модуля
$ cat /etc/systemd/system/hello-world.service
[Unit]
Description=Hello World Service
After=systend-user-sessions.service
[Service]
EnvironmentFile=/etc/sysconfig/hello-world
Type=simple
ExecStart=/usr/bin/java ... hello-world.jar
Затем настройте файл в /etc/sysconfig/hello-world
который содержит имена переменных Spring Boot в верхнем регистре. Например, переменная с именем server.port
будет SERVER_PORT
форму SERVER_PORT
в качестве переменной среды:
$ cat /etc/sysconfig/hello-world
SERVER_PORT=8081
Используемый здесь механизм заключается в том, что приложения Spring Boot возьмут список свойств, а затем переведут их, сделав все в верхнем регистре и заменив точки на подчеркивания. Как только приложение Spring Boot проходит через этот процесс, оно ищет переменные среды, которые соответствуют, и использует любые найденные соответственно.
Это выделено более подробно в этой статье вопросов и ответов под названием: Как установить свойство Spring Boot с подчеркиванием в его имени через переменные среды?
Рекомендации
Ответ 18
Следующая конфигурация требуется в файле build.gradle в проектах Spring Boot.
build.gradle
jar {
baseName = 'your-app'
version = version
}
springBoot {
buildInfo()
executable = true
mainClass = "com.shunya.App"
}
исполняемый файл = true
Это необходимо для того, чтобы сделать полностью исполняемый jar в unix-системе (Centos и Ubuntu)
Создать файл .conf
Если вы хотите настроить пользовательские свойства JVM или аргументы запуска приложения Spring Boot, то вы можете создать файл .conf с тем же именем, что и имя приложения Spring Boot, и разместить его параллельно файлу jar.
Учитывая, что your-app.jar - это имя вашего приложения Spring Boot, вы можете создать следующий файл.
JAVA_OPTS="-Xms64m -Xmx64m"
RUN_ARGS=--spring.profiles.active=prod
LOG_FOLDER=/custom/log/folder
Эта конфигурация установит 64 МБ оперативной памяти для приложения Spring Boot и активирует профиль продукта.
Создайте нового пользователя в Linux
Для повышения безопасности необходимо создать конкретного пользователя для запуска приложения Spring Boot в качестве службы.
Создать нового пользователя
sudo useradd -s /sbin/nologin springboot
В Ubuntu/Debian измените приведенную выше команду следующим образом:
sudo useradd -s /usr/sbin/nologin springboot
Установить пароль
sudo passwd springboot
Сделать Springboot владельцем исполняемого файла
chown springboot:springboot your-app.jar
Запретить изменение файла JAR
chmod 500 your-app.jar
Это позволит настроить разрешения jars так, чтобы они не могли быть записаны и могли быть прочитаны или выполнены только его владельцем springboot.
При желании вы можете сделать свой JAR файл неизменным с помощью команды change attribute (chattr).
sudo chattr +i your-app.jar
Соответствующие разрешения должны быть установлены и для соответствующего файла .conf..conf требует доступа только для чтения (Octal 400) вместо доступа для чтения + выполнения (Octal 500)
chmod 400 your-app.conf
Создать службу Systemd
/etc/systemd/system/your-app.service
[Unit]
Description=Your app description
After=syslog.target
[Service]
User=springboot
ExecStart=/var/myapp/your-app.jar
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
Автоматический перезапуск процесса, если он был убит ОС
Добавьте следующие два атрибута (Restart и RestartSec), чтобы автоматически перезапустить процесс при сбое.
/etc/systemd/system/your-app.service
[Service]
User=springboot
ExecStart=/var/myapp/your-app.jar
SuccessExitStatus=143
Restart=always
RestartSec=30
Это изменение приведет к перезагрузке приложения Spring Boot в случае сбоя с задержкой в 30 секунд. Если вы остановите службу с помощью команды systemctl, перезапуск не произойдет.
Запланируйте обслуживание при запуске системы
Чтобы пометить приложение для автоматического запуска при загрузке системы, используйте следующую команду:
Включить приложение Spring Boot при запуске системы
sudo systemctl enable your-app.service
Начать Остановить службу
systemctl можно использовать в Ubuntu 16.04 LTS и 18.04 LTS для запуска и остановки процесса.
Начать процесс
sudo systemctl start your-app
Остановить процесс
sudo systemctl stop your-app
Ссылки
https://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html
Ответ 19
Создайте скрипт с именем your-app.service(rest-app.service).
Мы должны поместить этот скрипт в каталог /etc/systemd/system.
Вот пример содержимого скрипта
[Unit]
Description=Spring Boot REST Application
After=syslog.target
[Service]
User=javadevjournal
ExecStart=/var/rest-app/restdemo.jar
SuccessExitStatus=200
[Install]
WantedBy=multi-user.target
Далее:
service rest-app start
Ссылки
введите описание ссылки здесь