公司用了六年的 SpringBoot 项目部署方案,稳得一批!( 二 )

  • excludes节点: 排除主jar包中配置等一些列后缀文件,因为我们要包这些配置文件放到主包外面
  • descriptor节点: 用来指定assembly插件对应的assembly.xml配置文件
  • 有了上面mvn配置,我们还需要assembly.xml的配置,这里提取了结合shell脚本发布程序的配置:
    <assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsdhttp://maven.apache.org/ASSEMBLY/2.0.0 "><id>${activeProfile}</id><!--打包成一个用于发布的zip文件--><formats><format>zip</format></formats><!--true:zip中生成一级目录(此处屏蔽 , 配合脚本需要profiles后缀)--><includeBaseDirectory>false</includeBaseDirectory><dependencySets><dependencySet><!--打包进zip文件的lib目录--><useProjectArtifact>false</useProjectArtifact><outputDirectory>${package-name}-${activeProfile}/lib</outputDirectory><unpack>false</unpack></dependencySet></dependencySets><fileSets><!-- 配置文件打包进zip文件的conf目录 --><fileSet><directory>${project.basedir}/src/main/profiles/${activeProfile}</directory><outputDirectory>${package-name}-${activeProfile}/conf</outputDirectory><includes><include>**/*</include><!--<include>*.xml</include>--><!--<include>*.properties</include>--><!--<include>*.yml</include>--></includes></fileSet><!--启动脚本打包进zip文件--><fileSet><directory>${project.basedir}/src/main/scripts</directory><outputDirectory></outputDirectory><includes><include>**/*</include></includes><!-- 文件文件权限为777 --><fileMode>777</fileMode><!-- 目录权限为777--><directoryMode>777</directoryMode><!--脚本中参数变量为pom中的值 关键--><filtered>true</filtered></fileSet><!-- 项目编译出来的jar打包进zip文件 --><fileSet><directory>${project.build.directory}</directory><outputDirectory>${package-name}-${activeProfile}/</outputDirectory><includes><include>*.jar</include></includes></fileSet></fileSets></assembly>重点节点介绍:
    • formats节点: 把配置文件和jar包等压缩成什么文件格式,这里可以有:zip,tar等
    • fileMode节点: 指定scripts目录下脚本文件(这里是:shenniu_publish.sh)在linux上文件权限为777
    • filtered节点: 脚本中参数变量为pom的profiles中properties的值(该配置,是把mvn中属性值映射生成到sh文件中,如:${package-name})
    完成上面配置后 , 此时我们可以通过idea上勾选切换不同环境来打zip包,如图:
    公司用了六年的 SpringBoot 项目部署方案,稳得一批!

    文章插图
    分享shenniu_publish.sh程序启动工具上面步骤完成了zip格式的发布包,我们再分享下启动程序的shell脚本 , 该脚本具有的功能如:
    • 解压zip+启动jar包
    • 启动jar包
    • 停止对应jar运行
    • 重启jar程序
    目前该shell中封装了两种启动jar命令的方式:
    • JAVA -cp
    • java -jar
    如图命令格式:
    公司用了六年的 SpringBoot 项目部署方案,稳得一批!

    文章插图
    来看全部的shell代码:
    #!/usr/bin/env bash#可变参数变量languageType="javac" #支持 java,javac.NETcore 发布#参数值由pom文件传递baseZipName="${package-name}-${activeProfile}" #压缩包名称publish-test.zip的publishpackageName="${package-name}" #命令启动包名 xx.jar的xxmainclass="${boot-main}" #java -cp启动时,指定main入口类;命令:java -cp conf;lib*.jar;${packageName}.jar ${mainclass}#例子# baseZipName="publish-test" #压缩包名称publish-test.zip的publish# packageName="publish" #命令启动包名 publish.jar的xx#固定变量basePath=$(cd `dirname $0`/; pwd)baseZipPath="${basePath}/${baseZipName}.zip"#压缩包路径baseDirPath="${basePath}" #解压部署磁盘路径pid= #进程pid#解压function shenniu_unzip(){echo "解压---------------------------------------------"echo "压缩包路径:${baseZipPath}"if [ ! `find ${baseZipPath}` ]thenecho "不存在压缩包:${baseZipPath}"elseecho "解压磁盘路径:${baseDirPath}/${baseZipName}"echo "开始解压..."#解压命令unzip -od ${baseDirPath}/${baseZipName} ${baseZipPath}#设置执行权限chmod +x ${baseDirPath}/${baseZipName}/${packageName}echo "解压完成 。"fi}#检测pidfunction getPid(){echo "检测状态---------------------------------------------"pid=`ps -ef | grep -n ${packageName} | grep -v grep | awk '{print $2}'`if [ ${pid} ]thenecho "运行pid:${pid}"elseecho "未运行"fi}#启动程序function start(){#启动前,先停止之前的stopif [ ${pid} ]thenecho "停止程序失败,无法启动"elseecho "启动程序---------------------------------------------"#选择语言类型read -p "输入程序类型(java,javac,netcore) , 下一步按回车键(默认:${languageType}):" read_languageTypeif [ ${read_languageType} ]thenlanguageType=${read_languageType}fiecho "选择程序类型:${languageType}"#进入运行包目录cd ${baseDirPath}/${baseZipName}#分类启动if [ "${languageType}" == "javac" ]thenif [ ${mainclass} ]thennohup java -cp conf:lib*.jar:${packageName}.jar ${mainclass} >${baseDirPath}/${packageName}.out 2>&1 &#nohup java -cp conf:lib*.jar:${packageName}.jar ${mainclass} >/dev/null 2>&1 &fielif [ "${languageType}" == "java" ]thennohup java -jar ${baseDirPath}/${baseZipName}/${packageName}.jar >/dev/null 2>&1 &# java -jar ${baseDirPath}/${baseZipName}/${packageName}.jarelif [ "${languageType}" == "netcore" ]then#nohup dotnet run ${baseDirPath}/${baseZipName}/${packageName} >/dev/null 2>&1 &nohup ${baseDirPath}/${baseZipName}/${packageName} >/dev/null 2>&1 &fi#查询是否有启动进程getPidif [ ${pid} ]thenecho "已启动"#nohup日志tail -n 50 -f ${baseDirPath}/${packageName}.outelseecho "启动失败"fifi}#停止程序function stop(){getPidif [ ${pid} ]thenecho "停止程序---------------------------------------------"kill -9 ${pid}getPidif [ ${pid} ]then#stopecho "停止失败"elseecho "停止成功"fifi}#启动时带参数,根据参数执行if [ ${#} -ge 1 ]thencase ${1} in"start")start;;"restart")start;;"stop")stop;;"unzip")#执行解压shenniu_unzip#执行启动start;;*)echo "${1}无任何操作";;esacelseecho "command如下命令:unzip:解压并启动start:启动stop:停止进程restart:重启示例命令如:./shenniu_publish start"fi


    推荐阅读