架构实战篇(四):Spring Boot 整合 Thymeleaf
架构实战篇(十六):Spring Boot Assembly服务化打包
前言
当你的服务器上面的tomcat部署了好几个web项目,当有个别项目需要更新升级的时候,往往我们会把tomcat 关闭然后替换需要升级的war包,然后再启动tomcat
这样做的弊端
war包传输比较慢,每次都要把依赖包都上传上去
重启tomcat 会把所有的服务都停掉,体验不好
动态修改静态资源麻烦
下面就通过使用 Assembly 和集成 Thymeleaf 规避上面的弊端
一、先看下目录结构
我们在 Thymeleaf 的基础上增加了 Assembly 的支持
二、配置 spring boot loader
pom.xml 增加 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-loader</artifactId>
</dependency>
在resources 目录下增加 loader.properties
loader.main=sample.web.ui.SampleWebUiApplication
在 start.sh 命令中使用
#!/bin/bash
cd `dirname $0`
BIN_DIR=`pwd`
cd ..
DEPLOY_DIR=`pwd`
CONF_DIR=$DEPLOY_DIR/conf
PIDS=`ps -ef | grep java | grep "$CONF_DIR" |awk '{print $2}'`
if [ -n "$PIDS" ]; then
echo "ERROR: The server already started!"
echo "PID: $PIDS"
exit 1
fi
LOGS_DIR=""
if [ -n "$LOGS_FILE" ]; then
LOGS_DIR=`dirname $LOGS_FILE`
else
LOGS_DIR=$DEPLOY_DIR/logs
fi
if [ ! -d $LOGS_DIR ]; then
mkdir $LOGS_DIR
fi
STDOUT_FILE=$LOGS_DIR/stdout.log
LIB_DIR=$DEPLOY_DIR/lib
LIB_JARS=`ls $LIB_DIR|grep .jar|awk '{print "'$LIB_DIR'/"$0}'|tr "\n" ":"`
JAVA_OPTS="$JAVA_OPTS -Duser.timezone=Asia/Shanghai -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true "
JAVA_DEBUG_OPTS=""
if [ "$1" = "debug" ]; then
JAVA_DEBUG_OPTS=" -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n "
fi
JAVA_JMX_OPTS=""
if [ "$1" = "jmx" ]; then
JAVA_JMX_OPTS=" -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false "
fi
JAVA_MEM_OPTS="${JAVA_MEM_OPTS}"
SPRING_PROFILES_ACTIVE=${SPRING_PROFILES_ACTIVE:=prod}
echo -e "Starting the server ...\c"
CMD="java $JAVA_OPTS $JAVA_MEM_OPTS $JAVA_DEBUG_OPTS $JAVA_JMX_OPTS -Dspring.profiles.active=$SPRING_PROFILES_ACTIVE -classpath $CONF_DIR:$LIB_JARS \
-Dloader.config.location=${CONF_DIR}/loader.properties \
org.springframework.boot.loader.PropertiesLauncher"
if [ "$1" = "run" ]; then
$CMD
else
nohup $CMD > $STDOUT_FILE 2>&1 &
echo "OK!"
PIDS=`ps -ef | grep java | grep "$DEPLOY_DIR" | awk '{print $2}'`
echo "PID: $PIDS"
echo "STDOUT: $STDOUT_FILE"
fi
优点:不用频繁修改启动脚本
三、Thymeleaf 读取不到模板页面问题解决
<assembly>
<id>assembly</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>true</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>src/main/assembly/bin</directory>
<outputDirectory>bin</outputDirectory>
<fileMode>0755</fileMode>
</fileSet>
<fileSet>
<directory>src/main/resources/</directory>
<outputDirectory>conf</outputDirectory>
<includes>
<include>*.properties</include>
<include>static/**</include>
<include>templates/**</include>
</includes>
</fileSet>
</fileSets>
<dependencySets>
<dependencySet>
<outputDirectory>lib</outputDirectory>
</dependencySet>
</dependencySets>
</assembly>
在 assembly.xml 文件中增加
<include>static/**</include>
<include>templates/**</include>
四、打包后的springboot应用结构图
这样配置完成后,执行mvn 打包命令就会把 static 和 templates 文件都复制到 conf 目录下
网上也有一些说修改 assembly 的默认路径的,但是那种效果并不是很理想
总结:这个方案本身并没有带来什么新东西,主要是通过组合现有的技术来解决和方便项目的升级和维护。
关注我们
注意:本文归作者所有,未经作者允许,不得转载