Spring Boot 项目打包 + Shell 脚本部署实践,太有用了! 您所在的位置:网站首页 springboot打包插件 Spring Boot 项目打包 + Shell 脚本部署实践,太有用了!

Spring Boot 项目打包 + Shell 脚本部署实践,太有用了!

#Spring Boot 项目打包 + Shell 脚本部署实践,太有用了!| 来源: 网络整理| 查看: 265

云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!

本篇和大家分享的是springboot打包并结合shell脚本命令部署,重点在分享一个shell程序启动工具,希望能便利工作;

profiles指定不同环境的配置maven-assembly-plugin打发布压缩包分享shenniu_publish.sh程序启动工具linux上使用shenniu_publish.sh启动程序

profiles指定不同环境的配置

通常一套程序分为了很多个部署环境:开发,测试,uat,线上 等,我们要想对这些环境区分配置文件,可以通过两种方式:

通过application.yml中编码指定 profile.active=uat 方式指定通过mvn中profiles来区分不同环境对应的配置文件夹,人工可以手动在idea勾选生成不同环境的包(推荐)

这里我们要讲的是第二种,首先在mvn中配置如下内容:

node node ${scripts_packageName} ${scripts_bootMain} true node1 node1 ${scripts_packageName} ${scripts_bootMain} node2 node2 ${scripts_packageName} ${scripts_bootMain}

节点粗解:

B4B2D43E_3760_4118_A9CE_CE9E9C6BA5B3

maven-assembly-plugin打发布压缩包

对于springboot程序打包,可以分为jar和war,这里是jar包;有场景是咋们配置文件或者第三方等依赖包不想放到工程jar中,并且把这些文件压缩成一个zip包,方便上传到linux;此时通过maven-assembly-plugin和maven-jar-plugin就可以做到,mvn的配置如:

org.apache.maven.plugins maven-jar-plugin 2.6 false true lib/ ${scripts_bootMain} **/*.yml **/*.properties **/*.xml **/*.sh make-a-jar compile jar org.apache.maven.plugins maven-assembly-plugin 2.4 ${project.basedir}/src/main/assembly/assembly.xml make-assembly package single

值得注意的地方如下几点:

mainClass节点:用来指定启动main函数入口类路径,如这里的:com.sm.EurekaServerApplicationexcludes节点:排除主jar包中配置等一些列后缀文件,因为我们要包这些配置文件放到主包外面descriptor节点:用来指定assembly插件对应的assembly.xml配置文件有了上面mvn配置,我们还需要assembly.xml的配置,这里提取了结合shell脚本发布程序的配置

false false ${package-name}-${activeProfile}/lib false ${project.basedir}/src/main/profiles/${activeProfile} ${package-name}-${activeProfile}/conf **/* ${project.basedir}/src/main/scripts **/* 777 777 true ${project.build.directory} ${package-name}-${activeProfile}/ *.jar

重点节点介绍:

formats节点:把配置文件和jar包等压缩成什么文件格式,这里可以有:zip,tar等fileMode节点:指定scripts目录下脚本文件(这里是:shenniu_publish.sh)在linux上文件权限为777filtered节点:脚本中参数变量为pom的profiles中properties的值(该配置,是把mvn中属性值映射生成到sh文件中,如:${package-name})

完成上面配置后,此时我们可以通过idea上勾选切换不同环境来打zip包,如图:

867EA092_544A_41e8_A120_F6227C8F09B0

分享shenniu_publish.sh程序启动工具

上面步骤完成了zip格式的发布包,我们再分享下启动程序的shell脚本,该脚本具有的功能如,关注公众号互联网架构师,回复关键字2T,获取最新架构资料。

解压zip+启动jar包启动jar包停止对应jar运行重启jar程序

目前该shell中封装了两种启动jar命令的方式:

java -cpjava -jar

如图命令格式:

72D8B9CA_4C96_4d41_85B0_0B713A857B40

来看全部的shell代码:

#!/usr/bin/env bash #可变参数变量 languageType="javac" #支持 java,javac,netcore 发布 #参数值由pom文件传递 baseZipName="${package-name}-${activeProfile}" #压缩包名称 publish-test.zip的publish packageName="${package-name}" #命令启动包名 xx.jar的xx mainclass="${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}` ] then echo "不存在压缩包:${baseZipPath}" else echo "解压磁盘路径:${baseDirPath}/${baseZipName}" echo "开始解压..." #解压命令 unzip -od ${baseDirPath}/${baseZipName} ${baseZipPath} #设置执行权限 chmod +x ${baseDirPath}/${baseZipName}/${packageName} echo "解压完成。" fi } #检测pid function getPid() { echo "检测状态---------------------------------------------" pid=`ps -ef | grep -n ${packageName} | grep -v grep | awk '{print $2}'` if [ ${pid} ] then echo "运行pid:${pid}" else echo "未运行" fi } #启动程序 function start() { #启动前,先停止之前的 stop if [ ${pid} ] then echo "停止程序失败,无法启动" else echo "启动程序---------------------------------------------" #选择语言类型 read -p "输入程序类型(java,javac,netcore),下一步按回车键(默认:${languageType}):" read_languageType if [ ${read_languageType} ] then languageType=${read_languageType} fi echo "选择程序类型:${languageType}" #进入运行包目录 cd ${baseDirPath}/${baseZipName} #分类启动 if [ "${languageType}" == "javac" ] then if [ ${mainclass} ] then nohup 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 & fi elif [ "${languageType}" == "java" ] then nohup java -jar ${baseDirPath}/${baseZipName}/${packageName}.jar >/dev/null 2>&1 & # java -jar ${baseDirPath}/${baseZipName}/${packageName}.jar elif [ "${languageType}" == "netcore" ] then #nohup dotnet run ${baseDirPath}/${baseZipName}/${packageName} >/dev/null 2>&1 & nohup ${baseDirPath}/${baseZipName}/${packageName} >/dev/null 2>&1 & fi #查询是否有启动进程 getPid if [ ${pid} ] then echo "已启动" #nohup日志 tail -n 50 -f ${baseDirPath}/${packageName}.out else echo "启动失败" fi fi } #停止程序 function stop() { getPid if [ ${pid} ] then echo "停止程序---------------------------------------------" kill -9 ${pid} getPid if [ ${pid} ] then #stop echo "停止失败" else echo "停止成功" fi fi } #启动时带参数,根据参数执行 if [ ${#} -ge 1 ] then case ${1} in "start") start ;; "restart") start ;; "stop") stop ;; "unzip") #执行解压 shenniu_unzip #执行启动 start ;; *) echo "${1}无任何操作" ;; esac else echo " command如下命令: unzip:解压并启动 start:启动 stop:停止进程 restart:重启 示例命令如:./shenniu_publish start " fi

正如上面小节说的,shell中的参数 package-name,activeProfile,boot-main 都是由mvn中profiles的properties中提供,是可变的参数,脚本代码本身不需要人工去修改,只需要变的是mvn的参数即可;其实在我们生成zip包的时候,shell中的参数就被替换了,可以看zip中shell文件内容如:

0C94F322_829D_443b_B2BC_1D2CF1EA6BA4

linux上使用shenniu_publish.sh启动程序

把生成的zip上传到linux上,通过命令解压:

unzip -od eureka-server-0.0.1-node eureka-server-0.0.1-node.zip

其实shell脚本中包含有解压命令,但是我在打包时放在了zip中,所以只能通过手动解压了,当然可以调整;此时进入加压目录如此:

559ABDF8_5AC5_448a_85DB_9F48BE94CF4A

vim shenniu_publish.sh set ff=unix :wq

6BFD5729_0AED_4920_9F78_91958D83B788

可以去研究下shell代码,希望该脚本能给你带来效率和好的学习思路,下面是测试用例git地址,脚本在eureka-server项目中:https://github.com/shenniubuxing3/springcloud-Finchley.SR2

【云栖号在线课堂】每天都有产品技术专家分享!课程地址:https://yqh.aliyun.com/zhibo

立即加入社群,与专家面对面,及时了解课程最新动态!【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK

原文发布时间:2020-07-10本文作者:神牛003本文来自:“互联网架构师”,了解相关信息可以关注“互联网架构师”



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有