1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Spring Boot 使用 Maven assembly 插件打包

Spring Boot 使用 Maven assembly 插件打包

时间:2023-09-02 18:37:37

相关推荐

Spring Boot 使用 Maven assembly 插件打包

文章目录

1 摘要2 Maven 核心依赖与配置2.1 pom.xml 配置2.2 assembly 配置信息3 启动与停止脚本3.1 启动脚本3.2 停止脚本4 推荐参考资料5 Github 源码

1 摘要

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

Assembly 官网: /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="/ASSEMBLY/2.1.0"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/ASSEMBLY/2.1.0 /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}" ]]; thenmkdir "${LOG_DIR}"fi# 如果logs/back文件夹不存在,则创建文件夹if [[ ! -d "${LOG_BACK_DIR}" ]]; thenmkdir "${LOG_BACK_DIR}"fi# 如果项目运行日志存在,则重命名备份if [[ -f "${LOG_PATH}" ]]; thenmv ${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 &# 进程IDPID=$(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" ]]thenecho ${APPLICATION} is already stoppedelseecho kill ${PID}kill -9 ${PID}echo ${APPLICATION} stopped successfullyfi

4 推荐参考资料

官方文档 Apache Maven Assembly Plugin

spring-boot-assembly

5 Github 源码

Gtihub 源码地址: /Flying9001/springBootDemo

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。