Spring Boot 使用 Maven assembly 插件打包


1 摘要

Spring boot 自身封装了一套 Maven 打包工具,可以将 Spring Boot 项目打包成一个包含依赖 jar 的可执行 jar 文件。 Spring Boot 打包是将class文件和配置文件一起打包进一个 jar 文件,使用 Maven assembly 打包能够将两者分开,从而可以实现在已经有 jar 文件的情况下,修改配置文件的功能(需要配合启动脚本),从而实现一个 jar 文件,多环境部署。

Assembly 官网: https://maven.apache.org/plugins/maven-assembly-plugin

2 Maven 核心依赖与配置

2.1 pom.xml 配置
./demo-maven-assembly/pom.xml
    <build>
        <finalName>demo-maven-assembly</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.3.0</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <descriptors>
                        <descriptor>src/main/assembly/assembly.xml</descriptor>
                    </descriptors>
                </configuration>
            </plugin>
        </plugins>
    </build>

其中 src/main/assembly/assembly.xml 为 assembly 的打包配置文件

2.2 assembly 配置信息
./demo-maven-assembly/src/main/assembly/assembly.xml
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0 http://maven.apache.org/xsd/assembly-2.1.0.xsd">
    <id>distribution</id>
    <formats>
        <format>tar.gz</format>
    </formats>
    <includeBaseDirectory>true</includeBaseDirectory>

    <files>
        <file>
            <fileMode>775</fileMode>
            <source>target/${project.build.finalName}.jar</source>
            <destName>demo-maven-assembly.jar</destName>
            <outputDirectory>./target</outputDirectory>
        </file>
    </files>

    <fileSets>
        <fileSet>
            <directory>src/main/resources</directory>
            <outputDirectory>./conf</outputDirectory>
            <includes>
                <include>*.yml</include>
                <include>*.properties</include>
            </includes>
        </fileSet>
        <fileSet>
            <fileMode>775</fileMode>
            <directory>deploy/bin</directory>
            <outputDirectory>./bin</outputDirectory>
        </fileSet>
        <fileSet>
            <directory>${basedir}</directory>
            <includes>
                <include>*.md</include>
            </includes>
        </fileSet>

    </fileSets>

</assembly>

3 启动与停止脚本

Spring boot 可通过启动命令指定 jar 的运行环境变量,也可以将变量写进配置文件内,读取外部的配置信息,通过将配置文件外置的方式就能够灵活地修改配置信息,实现多环境部署。将这些启动命令写入固定的文件,即为启动脚本。

3.1 启动脚本
./demo-maven-assembly/deploy/bin/startup.sh
#!/bin/bash

# 项目名称
APPLICATION="demo-maven-assembly"

# 项目启动jar包名称
APPLICATION_JAR="demo-maven-assembly.jar"

# bin目录绝对路径
BIN_PATH=$(cd `dirname $0`; pwd)
# 进入bin目录
cd `dirname $0`
# 返回到上一级项目根目录路径
cd ..
# 打印项目根目录绝对路径
# `pwd` 执行系统命令并获得结果
BASE_PATH=`pwd`

# 外部配置文件绝对目录,如果是目录需要/结尾,也可以直接指定文件
# 如果指定的是目录,spring则会读取目录中的所有配置文件
CONFIG_DIR=${BASE_PATH}"/conf/"

# 项目日志输出绝对路径
LOG_DIR=${BASE_PATH}"/logs"
LOG_FILE="${APPLICATION}.log"
LOG_PATH="${LOG_DIR}/${LOG_FILE}"
# 日志备份目录
LOG_BACK_DIR="${LOG_DIR}/back/"

# 项目启动日志输出绝对路径
LOG_STARTUP_PATH="${LOG_DIR}/startup.log"

# 当前时间
NOW=`date +'%Y-%m-%m-%H-%M-%S'`
NOW_PRETTY=`date +'%Y-%m-%m %H:%M:%S'`

# 启动日志
STARTUP_LOG="================================================ ${NOW_PRETTY} ================================================\n"

# 如果logs文件夹不存在,则创建文件夹
if [[ ! -d "${LOG_DIR}" ]]; then
  mkdir "${LOG_DIR}"
fi

# 如果logs/back文件夹不存在,则创建文件夹
if [[ ! -d "${LOG_BACK_DIR}" ]]; then
  mkdir "${LOG_BACK_DIR}"
fi

# 如果项目运行日志存在,则重命名备份
if [[ -f "${LOG_PATH}" ]]; then
	mv ${LOG_PATH} "${LOG_BACK_DIR}/${APPLICATION}_back_${NOW}.log"
fi

# 创建新的项目运行日志
echo "" > ${LOG_PATH}

# 如果项目启动日志不存在,则创建,否则追加
#echo "${STARTUP_LOG}" >> ${LOG_STARTUP_PATH}

#==========================================================================================
# JVM Configuration
# -Xmx256m:设置JVM最大可用内存为256m,根据项目实际情况而定,建议最小和最大设置成一样。
# -Xms256m:设置JVM初始内存。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存
# -Xmn512m:设置年轻代大小为512m。整个JVM内存大小=年轻代大小 + 年老代大小 + 持久代大小。
#          持久代一般固定大小为64m,所以增大年轻代,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8
# -XX:MetaspaceSize=64m:存储class的内存大小,该值越大触发Metaspace GC的时机就越晚
# -XX:MaxMetaspaceSize=320m:限制Metaspace增长的上限,防止因为某些情况导致Metaspace无限的使用本地内存,影响到其他程序
# -XX:-OmitStackTraceInFastThrow:解决重复异常不打印堆栈信息问题
#==========================================================================================
JAVA_OPT="-server -Xms256m -Xmx256m -Xmn512m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=256m"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"

#=======================================================
# 将命令启动相关日志追加到日志文件
#=======================================================

# 输出项目名称
STARTUP_LOG="${STARTUP_LOG}application name: ${APPLICATION}\n"
# 输出jar包名称
STARTUP_LOG="${STARTUP_LOG}application jar name: ${APPLICATION_JAR}\n"
# 输出项目根目录
STARTUP_LOG="${STARTUP_LOG}application root path: ${BASE_PATH}\n"
# 输出项目bin路径
STARTUP_LOG="${STARTUP_LOG}application bin  path: ${BIN_PATH}\n"
# 输出项目config路径
STARTUP_LOG="${STARTUP_LOG}application config path: ${CONFIG_DIR}\n"
# 打印日志路径
STARTUP_LOG="${STARTUP_LOG}application log  path: ${LOG_PATH}\n"
# 打印JVM配置
STARTUP_LOG="${STARTUP_LOG}application JAVA_OPT : ${JAVA_OPT}\n"


# 打印启动命令
STARTUP_LOG="${STARTUP_LOG}application startup command: nohup java ${JAVA_OPT} -jar ${BASE_PATH}/target/${APPLICATION_JAR} --spring.config.location=${CONFIG_DIR} > ${LOG_PATH} 2>&1 &\n"


#======================================================================
# 执行启动命令:后台启动项目,并将日志输出到项目根目录下的logs文件夹下
#======================================================================
nohup java ${JAVA_OPT} -jar ${BASE_PATH}/target/${APPLICATION_JAR} --spring.config.location=${CONFIG_DIR} > ${LOG_PATH} 2>&1 &


# 进程ID
PID=$(ps -ef | grep "${APPLICATION_JAR}" | grep -v grep | awk '{ print $2 }')
STARTUP_LOG="${STARTUP_LOG}application pid: ${PID}\n"

# 启动日志追加到启动日志文件中
echo -e ${STARTUP_LOG} >> ${LOG_STARTUP_PATH}
# 打印启动日志
echo -e ${STARTUP_LOG}

# 打印项目日志
tail -f ${LOG_PATH}

3.2 停止脚本
./demo-maven-assembly/deploy/bin/shutdown.sh
#! /bin/bash

# 项目名称
APPLICATION="demo-maven-assembly"

# 项目启动jar包名称
APPLICATION_JAR="demo-maven-assembly.jar"

PID=$(ps -ef | grep "${APPLICATION_JAR}" | grep -v grep | awk '{ print $2 }')
if [[ -z "$PID" ]]
then
    echo ${APPLICATION} is already stopped
else
    echo kill  ${PID}
    kill -9 ${PID}
    echo ${APPLICATION} stopped successfully
fi

4 推荐参考资料

官方文档 Apache Maven Assembly Plugin

spring-boot-assembly

5 Github 源码

Gtihub 源码地址 : https://github.com/Flying9001/springBootDemo

个人公众号:404Code,分享半个互联网人的技术与思考,感兴趣的可以关注.
404Code

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多模块Spring Boot项目打包是指将多个Spring Boot项目打包成一个单独的包或安装包,以便在其他计算机上运行和使用。这可以通过以下步骤实现: 1. 创建项目结构:在项目中创建一个主模块和一个或多个子模块。主模块通常包含入口点应用程序和公共依赖项,而子模块包含特定的业务逻辑或功能。 2. 配置主模块:在主模块的pom.xml文件中,添加必要的依赖项和插件来支持打包。这些插件包括Maven Surefire插件Maven Assembly插件。 3. 配置子模块:在子模块的pom.xml文件中,添加必要的依赖项和插件来引用主模块。 4. 构建项目:在命令行中运行mvn clean install命令,以构建整个项目。这将生成一个或多个可执行的JAR文件,每个文件对应一个模块。 5. 打包所有模块:可以使用Maven Assembly插件将所有模块打包成一个单独的包。该插件可以将不同的模块组合在一起,并创建单个可执行文件或安装包。 6. 发布到中央仓库:如果需要将项目发布到中央仓库或其他源代码管理库中,可以使用Maven的发布插件(如Maven Deploy插件)将打包后的文件上传到仓库中。 需要注意的是,多模块Spring Boot项目的打包过程可能会因项目的复杂性而有所不同。因此,建议仔细阅读相关文档和教程,以确保正确地执行打包过程。此外,还可以使用一些工具和库来简化打包过程,如Maven Shade插件和Gradle插件等。这些工具和库可以帮助您更轻松地管理依赖关系和打包过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值