试试Spring Boot的可执行War文件
完全可执行的战争
从Spring Boot 1.3.0.RELEASE开始,不仅可以将Spring Boot应用程序作为可执行的War文件运行,还可以作为Fully Executable War文件运行。
对于可执行的War文件,需要使用systemd来启动java,因此需要创建一个shell。但是如果将其设置为Fully Executable War文件,则不需要创建这样的shell了。
如何创建完全可执行的战争方案
当将spring-boot-maven-plugin添加为插件并将executable配置设为true后,执行mvn install将会创建一个Fully Executable War文件。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId> <version>1.3.1.RELEASE</version>
</parent>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
</configuration>
</plugin>
</plugins>
</build>
在”Fully Executable War”的开头,有一个用来启动的shell脚本。
需要注意的是,这个脚本即使使用unzip或者jar -xvf等解压命令也不会被展开。
[user01@a12b89fed9fa /]$ more sample-api-1.0-SNAPSHOT.war
#!/bin/bash
#
# . ____ _ __ _ _
# /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
# ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
# \\/ ___)| |_)| | | | | || (_| | ) ) ) )
# ' |____| .__|_| |_|_| |_\__, | / / / /
# =========|_|==============|___/=/_/_/_/
# :: Spring Boot Startup Script ::
#
### BEGIN INIT INFO
# Provides: sample-api
# Required-Start: $remote_fs $syslog $network
# Required-Stop: $remote_fs $syslog $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: sample-api
# Description: Spring Boot Starter Parent
# chkconfig: 2345 99 01
### END INIT INFO
[[ -n "$DEBUG" ]] && set -x
# Initialize variables that cannot be provided by a .conf file
WORKING_DIR="$(pwd)"
[[ -n "$JARFILE" ]] && jarfile="$JARFILE"
[[ -n "$APP_NAME" ]] && identity="$APP_NAME"
〜以下略〜
echo "Usage: $0 {start|stop|restart|force-reload|status|run}"; exit 1;
esac
exit 0
〜以下バイナリ部〜
这个shell是由spring-boot-maven-plugin嵌入的。
默认情况下,应用以下的shell。
- launch.script
服务化
将war文件放在适当的位置,并在/etc/init.d中创建符号链接,即可通过service命令启动。
ln -s /opt/spring/sample-api/current/lib/sample-api.war /etc/init.d/sample-api
chkconfig --add sample-api
service sample-api start
另外,当执行service时,Java进程的用户将成为war文件的所有者。
[user01@46399238b318 ~]$ ps -ef | grep spring.profiles.active
user01 2577 1 0 Dec27 ? 00:05:37 /usr/java/default/bin/java -Dsun.misc.URLClassPath.disableJarChecking=true -server -Dspring.profiles.active=local -jar /opt/spring/sample/current/lib/sample-api.war
更改运行级别和启动停止优先级
默认情况下,runlevel为2345,启动优先级为99,停止优先级为01。
要进行更改,请按照以下方式将chkconfig的值设置到initInfoChkConfig中。
在下面的示例中,runlevel将变为2345,启动优先级为80,停止优先级为20。
此功能从Spring Boot 1.3.1.RELEASE版本开始可用。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
<embeddedLaunchScriptProperties>
<initInfoChkconfig>2345 80 20</initInfoChkconfig>
</embeddedLaunchScriptProperties>
</configuration>
</plugin>
修改JVM选项、PID输出位置等
可以设置虚拟机参数和PID文件的输出位置。在Fully Executable War相同的位置上,创建一个与war文件同名的conf文件,系统在启动时会读取该文件。
user01@a12b89fed9fa /]$ ls -lt /opt/spring/sample-api/current/lib/
合計 62200
-rwxr-xr-x 1 user01 user01 475 11月 7 23:59 2015 sample-api.conf
-rwxr-xr-x 1 user01 user01 63684691 11月 7 23:59 2015 sample-api.war
可以在官方文档中找到关于可以在conf文件中进行配置的项目。
* 关于Fully Executable War的启动配置设置
完全可执行的War包内的启动脚本会引用conf文件,因此除了官方记录的项目之外,还可以设置环境变量和进行各种其他处理。
# Fully Executable War内の起動シェルの46行目付近
[[ -r "${jarfolder}/${configfile}" ]] && source "${jarfolder}/${configfile}"
例如,如果执行umask 002,输出文件将以775权限正确地输出。
PID_FOLDER=/var/run/spring
LOG_FOLDER=/var/log/spring
umask 002
JAVA_HOME=/usr/java/jdk
JAVA_OPTS="-Dspring.profiles.active=local"