SpringBoot使用assembly进行项目定制化打包

一、项目配置

1.添加插件

(1)编辑项目的 pom.xml 文件,加入 assembly 打包插件:

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><!--主要使用的是maven提供的assembly插件完成--><artifactId>maven-assembly-plugin</artifactId><version>3.1.1</version><configuration><descriptors><!--具体的配置文件--><descriptor>src/main/assembly/assembly.xml</descriptor></descriptors></configuration><executions><execution><id>make-assembly</id><!--绑定到maven操作类型上--><phase>package</phase><!--运行一次--><goals><goal>single</goal></goals></execution></executions></plugin></plugins>
</build>

(2)从上面代码可以看出,把 assembly 的配置都放在 main/assembly 目录下。

2.编写服务 “启动 / 停止” 脚本

(1)首先在 assembly 目录下创建一个 bin 文件夹,然后在该文件夹下创建一个 start.sh 文件,这个是 linux 环境下的启动脚本,具体内容如下:
注意:开头的项目名称、jar 包名称不用我们手动设置,这里使用参数变量,在项目打包后这些参数自动会替换为 pom 的 profiles 中 properties 的值(assembly 配置文件需要开启属性替换功能),下面另外两个配置文件也同理。

#!/bin/bash# 项目名称
SERVER_NAME="${project.artifactId}"# jar名称
JAR_NAME="${project.build.finalName}.jar"# 进入bin目录
cd `dirname $0`
# bin目录绝对路径
BIN_DIR=`pwd`
# 返回到上一级项目根目录路径
cd ..
# 打印项目根目录绝对路径
# `pwd` 执行系统命令并获得结果
DEPLOY_DIR=`pwd`# 外部配置文件绝对目录,如果是目录需要/结尾,也可以直接指定文件
# 如果指定的是目录,spring则会读取目录中的所有配置文件
CONF_DIR=$DEPLOY_DIR/config
# SERVER_PORT=`sed '/server.port/!d;s/.*=//' config/application.properties | tr -d '\r'`
# 获取应用的端口号
SERVER_PORT=`sed -nr '/port: [0-9]+/ s/.*port: +([0-9]+).*/\1/p' config/application.yml`PIDS=`ps -f | grep java | grep "$CONF_DIR" |awk '{print $2}'`
if [ "$1" = "status" ]; thenif [ -n "$PIDS" ]; thenecho "The $SERVER_NAME is running...!"echo "PID: $PIDS"exit 0elseecho "The $SERVER_NAME is stopped"exit 0fi
fiif [ -n "$PIDS" ]; thenecho "ERROR: The $SERVER_NAME already started!"echo "PID: $PIDS"exit 1
fiif [ -n "$SERVER_PORT" ]; thenSERVER_PORT_COUNT=`netstat -tln | grep $SERVER_PORT | wc -l`if [ $SERVER_PORT_COUNT -gt 0 ]; thenecho "ERROR: The $SERVER_NAME port $SERVER_PORT already used!"exit 1fi
fi# 项目日志输出绝对路径
LOGS_DIR=$DEPLOY_DIR/logs
# 如果logs文件夹不存在,则创建文件夹
if [ ! -d $LOGS_DIR ]; thenmkdir $LOGS_DIR
fi
STDOUT_FILE=$LOGS_DIR/catalina.log# JVM Configuration
JAVA_OPTS=" -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true "
JAVA_DEBUG_OPTS=""
if [ "$1" = "debug" ]; thenJAVA_DEBUG_OPTS=" -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n "
fiJAVA_JMX_OPTS=""
if [ "$1" = "jmx" ]; thenJAVA_JMX_OPTS=" -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false "
fiJAVA_MEM_OPTS=""
BITS=`java -version 2>&1 | grep -i 64-bit`
if [ -n "$BITS" ]; thenJAVA_MEM_OPTS=" -server -Xmx512m -Xms512m -Xmn256m -XX:PermSize=128m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 "
elseJAVA_MEM_OPTS=" -server -Xms512m -Xmx512m -XX:PermSize=128m -XX:SurvivorRatio=2 -XX:+UseParallelGC "
fi# 加载外部log4j2文件的配置
LOG_IMPL_FILE=log4j2.xml
LOGGING_CONFIG=""
if [ -f "$CONF_DIR/$LOG_IMPL_FILE" ]
thenLOGGING_CONFIG="-Dlogging.config=$CONF_DIR/$LOG_IMPL_FILE"
fi
CONFIG_FILES=" -Dlogging.path=$LOGS_DIR $LOGGING_CONFIG -Dspring.config.location=$CONF_DIR/ "
echo -e "Starting the $SERVER_NAME ..."
nohup java $JAVA_OPTS $JAVA_MEM_OPTS $JAVA_DEBUG_OPTS $JAVA_JMX_OPTS $CONFIG_FILES -jar $DEPLOY_DIR/lib/$JAR_NAME > $STDOUT_FILE 2>&1 &COUNT=0
while [ $COUNT -lt 1 ]; doecho -e ".\c"sleep 1if [ -n "$SERVER_PORT" ]; thenCOUNT=`netstat -an | grep $SERVER_PORT | wc -l`elseCOUNT=`ps -f | grep java | grep "$DEPLOY_DIR" | awk '{print $2}' | wc -l`fiif [ $COUNT -gt 0 ]; thenbreakfi
doneecho "OK!"
PIDS=`ps -f | grep java | grep "$DEPLOY_DIR" | awk '{print $2}'`
echo "PID: $PIDS"
echo "STDOUT: $STDOUT_FILE"

(2)接着创建一个 stop.sh 文件,这个是 linux 环境下的停止脚本,具体内容如下:

#!/bin/bash# 项目名称
APPLICATION="${project.artifactId}"# 项目启动jar包名称
APPLICATION_JAR="${project.build.finalName}.jar"# 通过项目名称查找到PI,然后kill -9 pid
PID=$(ps -ef | grep "${APPLICATION_JAR}" | grep -v grep | awk '{ print $2 }')
if [[ -z "$PID" ]]
thenecho ${APPLICATION} is already stopped
elseecho kill  ${PID}kill -9 ${PID}echo ${APPLICATION} stopped successfully
fi

(3)最后创建一个 start.bat 文件,这个是 Windows 环境下的启动脚本,具体内容如下:

echo offset APP_NAME=${project.build.finalName}.jar
set LOG_IMPL_FILE=log4j2.xml
set LOGGING_CONFIG=
if exist ../config/%LOG_IMPL_FILE% (set LOGGING_CONFIG=-Dlogging.config=../config/%LOGGING_CONFIG%
)
set CONFIG= -Dlogging.path=../logs %LOGGING_CONFIG% -Dspring.config.location=../config/set DEBUG_OPTS=
if ""%1"" == ""debug"" (set DEBUG_OPTS= -Xloggc:../logs/gc.log -verbose:gc -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=../logsgoto debug
)set JMX_OPTS=
if ""%1"" == ""jmx"" (set JMX_OPTS= -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9888 -Dcom.sun.management.jmxremote.ssl=FALSE -Dcom.sun.management.jmxremote.authenticate=FALSEgoto jmx
)echo "Starting the %APP_NAME%"
java -Xms512m -Xmx512m -server %DEBUG_OPTS% %JMX_OPTS% %CONFIG% -jar ../lib/%APP_NAME%
echo "java -Xms512m -Xmx512m -server %DEBUG_OPTS% %JMX_OPTS% %CONFIG% -jar ../lib/%APP_NAME%"
goto end:debug
echo "debug"
java -Xms512m -Xmx512m -server %DEBUG_OPTS% %CONFIG% -jar ../lib/%APP_NAME%
goto end:jmx
java -Xms512m -Xmx512m -server %JMX_OPTS% %CONFIG% -jar ../lib/%APP_NAME%
goto end:end
pause

3.创建打包配置文件

最后,我们在 assembly 文件夹下创建一个 assembly.xml 配置文件,具体内容如下:

<assembly><!--必须写,否则打包时会有 assembly ID must be present and non-empty 错误这个名字最终会追加到打包的名字的末尾,如项目的名字为 hangge-test-0.0.1-SNAPSHOT,则最终生成的包名为 hangge-test-0.0.1-SNAPSHOT-bin.tar.gz--><id>bin</id><!-- 打包的类型,如果有N个,将会打N个类型的包 --><formats><format>tar.gz</format><!--<format>zip</format>--></formats><includeBaseDirectory>true</includeBaseDirectory><!--文件设置--><fileSets><!--0755->即用户具有读/写/执行权限,组用户和其它用户具有读写权限;0644->即用户具有读写权限,组用户和其它用户具有只读权限;--><!-- 将src/main/assembly/bin目录下的所有文件输出到打包后的bin目录中 --><fileSet><directory>src/main/assembly/bin</directory><outputDirectory>bin</outputDirectory><fileMode>0755</fileMode><!--如果是脚本,一定要改为unix.如果是在windows上面编码,会出现dos编写问题--><lineEnding>unix</lineEnding><filtered>true</filtered><!-- 是否进行属性替换 --></fileSet><!-- 将src/main/assembly/config目录下的所有文件输出到打包后的config目录中 --><fileSet><directory>src/main/assembly/config</directory><outputDirectory>config</outputDirectory><fileMode>0644</fileMode></fileSet><!-- 将src/main/resources下配置文件打包到config目录 --><fileSet><directory>src/main/resources</directory><outputDirectory>/config</outputDirectory><includes><include>**/*.xml</include><include>**/*.properties</include><include>**/*.yml</include></includes><filtered>true</filtered><!-- 是否进行属性替换 --></fileSet><!-- 将项目启动jar打包到lib目录中 --><fileSet><directory>target</directory><outputDirectory>lib</outputDirectory><includes><include>*.jar</include></includes></fileSet><!-- 将项目说明文档打包到docs目录中 --><fileSet><directory>.</directory><outputDirectory>docs</outputDirectory><includes><include>*.md</include></includes><fileMode>0644</fileMode></fileSet><fileSet><directory>docs</directory><outputDirectory>docs</outputDirectory><fileMode>0644</fileMode></fileSet><fileSet><directory>src/main/assembly/docs</directory><outputDirectory>docs</outputDirectory><fileMode>0644</fileMode></fileSet></fileSets></assembly>

二、打包测试

  1. 打包项目

(1)我们使用 mvn package 命令对项目进行打包:

SpringBoot使用assembly进行项目定制化打包相关推荐

  1. Gradle 实现 Android 多渠道定制化打包

    最近在项目中遇到需要实现 Apk 多渠道.定制化打包, 查找了一些资料,成功实现了上述功能,在此记录以备不时之需,温故而知新,可以为师矣~ 需求可以总结如下:  如何实现多个 Apk 安装在同一设备 ...

  2. [置顶]Gradle 实现 Android 多渠道定制化打包

    Gradle 实现 Android 多渠道定制化打包 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近在项目中遇到需要实现 Apk 多渠道.定制化打包, Google .百度查找了一些资料, ...

  3. Maven定制化打包后的包名(加入时间戳)

    在对应的pom文件中加入配置 设置时间戳格式 <properties> <maven.build.timestamp.format>yyyy-MM-dd_HH_mm</m ...

  4. SpringBoot定制化开发

    文章目录 SpringBoot定制化开发 SpringBoot定制化开发 原理分析套路: 先找他对应的场景,然后我们就可以定位到对应的xxxxAutoConfiguration看他内部导入了哪些组件, ...

  5. SpringBoot项目Docker化并上传DockerHub的使用过程

    . springboot项目 docker化 添加依赖 代码片段:<plugin><groupId>com.spotify</groupId><artifac ...

  6. 面向客户定制化开发项目的管理重点

    长期从事给客户定制化开发项目,这里分享下: 1.甲方要有专职高层关注项目,如果没有,那就创造一个: 2.以业务应用部门为推进项目的重点,信息部门只做辅助协调: 3.项目团队要精简: 4.项目团队要有核 ...

  7. springboot项目多moudle打包到一个jar

    springboot项目多moudle打包到一个jar 1.创建多moudle项目 参考:https://blog.csdn.net/tiantangdizhibuxiang/article/deta ...

  8. Vue-cli3项目seo优化--静态化打包(动态改变页面Titl、keyWords、description)

    Vue-cli3项目seo优化,静态化打包(动态改变页面Titl.keyWords.description) 文章目录 Vue-cli3项目seo优化,静态化打包(动态改变页面Titl.keyWord ...

  9. vue项目中动态创建模块以满足客户定制化需求的解决方案

    前端项目中很多时候会遇到这样的业务需求: 所有的客户都有共同的一些业务需求,即基础需求 基础需求需要根据业务发展进行升级 在共同需求的基础上,每个客户又有不同的需求(客制化) 如果只是一两个客户还好, ...

最新文章

  1. 我的mongo学习之路
  2. Javascript用递归的方式遍历json数组
  3. 如何在aspx.cs 里面获取html 控件值
  4. tar:file-changed-as-we-read-it报错处理
  5. stm32固件库assert_param()
  6. Cloud for Customer的工作中心(work center)加载器
  7. MFC中创建和使用线程的方法
  8. UI登陆页面素材|让设计师在竞争中脱颖而出
  9. Python 和 egg 文件
  10. 打包fpm mysql_fpm制做mysql-5.6.33 rpm包
  11. 三星真机云测平台可能是最好的云测平台,因为他免费。
  12. 伍斯特理工学院计算机研究生,伍斯特理工学院计算机工程硕士排名第52(2020年TFE Times排名)...
  13. rto净化效率计算公式_设备综合效率计算公式详解
  14. .NET跨平台:在CentOS上编译dnx并运行ASP.NET 5示例程序
  15. Unix Domain Sockets
  16. vmware+双显示器实现双系统同时使用
  17. Unity TimeLine使用详解 (自认为)
  18. buctoj周赛(5)逃离(三分+思维)
  19. tabIndex 和 aria注意点
  20. Spring三大核心思想之AOP(面向切面编程)

热门文章

  1. CTA-OS-NFC开关
  2. 5 mysql 凤舞天骄_凤舞天骄mysql初始化失败平台的搭建
  3. 浏览器插件配合高速多线程下载器
  4. Python笔记06
  5. 【面试现场】为什么要分稳定排序和非稳定排序?
  6. 三菱变频空调室外机工作异常和制冷/制热异常维修案例分析
  7. mysql从库并行,MySQL 并行复制从库发生自动重启分析
  8. itextsharp 导出PDF 包括图片 分页(全面)
  9. 数值分析-----不动点迭代和牛顿迭代(Python)
  10. Word无法保存或创建此文件。请确定用于保存此文件的磁盘未满、未受写保护且未被破坏。 保存文件