暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

架构实战篇(十七):Spring Boot Assembly 整合 thymeleaf

IT实战联盟 2018-10-29
271

架构实战篇(四):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 的默认路径的,但是那种效果并不是很理想

总结:这个方案本身并没有带来什么新东西,主要是通过组合现有的技术来解决和方便项目的升级和维护。

关注我们


文章转载自IT实战联盟,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论