试试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"
广告
将在 10 秒后关闭
bannerAds