当前位置: 首页 > 科技观察

SpringBoot打包不同环境配置和shell脚本部署

时间:2023-03-12 08:52:10 科技观察

本文给大家分享SpringBoot打包部署结合Shell脚本命令。重点是分享一个shell程序启动工具,希望对工作有所帮助;profiles指定不同环境的配置maven-assembly-plugin发布压缩包,共享shenniu_publish.sh程序启动工具。我使用shenniu_publish.sh在linux上启动程序。我把SpringBoot相关的技术文章整理成了PDF。关注微信关注号Java后台回复666即可下载本技术栈手册。配置文件指定不同环境的配置。通常,一套程序被划分为多个部署环境:开发、测试、uat、在线等,如果我们要区分这些环境的配置文件,可以使用两种方法:通过编码在application.yml中指定配置文件。active=uat方法指定mvn中的profiles用于区分不同环境对应的配置文件夹。可以手动签入idea在不同环境下生成包(推荐)。这里要说的是第二种,首先在mvn中配置如下内容:123node456node7${scripts_packageName}8${scripts_bootMain}91011true12131415node11617node118${scripts_packageName}19${scripts_bootMain}20212223node224<属性>25<活动veProfile>node226${scripts_packageName}27${scripts_bootMain}282930节点粗略的解决方案:id:用来指定不同环境配置文件所在的目录,如下:这里节点的值可以通过另一个assembly.xml或者shell脚本文件中的${package-name}获取,如下:activeByDefault:指定默认环境配置文件夹maven-assembly-plugin发布压缩包。对于springboot程序打包,可以分为jar和war,这里是jar包;有些场景我们不想在项目jar中放配置文件或者第三方依赖包,将这些文件压缩成zip包,方便上传到linux;这时,通过maven-Assembly-plugin和maven-jar-plugin就可以了,mvn配置如:12org.apache.maven.plugins3maven-jar-plugin42.6567false89true10lib/11${scripts_bootMain}1213141516**/*.yml17**/*.properties18**/*.xml19**/*.sh2021222324make-a-jar25compile2627jar28293031323334org.apache.maven.plugins35maven-assembly-plugin362.43738394041${project.basedir}/src/main/assembly/assembly.xml4243444546make-assembly47package4849single50515253值得注意的地方如下:mainClass节点:用于指定启动main函数的入口类路径,比如这里:com.sm.EurekaServerApplication排除节点:排除主jar包中的配置等一些后缀文件,因为我们需要将这些配置文件打包放在主包之外。descriptor节点:用于指定assembly插件对应的assembly.xml配置文件有了上面的mvn配置,我们还需要配置assembly.xml,这里是结合shell脚本发布程序的配置:${activeProfile}zipfalsefalse${package-name}-${activeProfile}/libfalse<文件集><目录>${project.basedir}/src/main/profiles/${activeProfile}${package-name}-${activeProfile}/conf**/*${project.basedir}/src/main/scripts**/*777777true${project.build.directory}${package-name}-${activeProfile}/*.jar关键节点介绍:formats节点:将配置文件和jar包压缩成什么文件格式,这里可以be:zip,fileMode节点如tar:指定scripts目录下的脚本文件(这里:shenniu_publish.sh),linux上文件权限为777filtered节点:脚本中的参数变量为profiles中properties的值pom的(这个配置是mvn中的属性)value映射生成到sh文件中,如:${package-name})完成以上配置后,我们可以通过勾选打印zip包的idea来切换不同环境,如图:sharetheshenniu_publish.sh程序启动工具步骤完成zip格式的发布包,下面分享一下启动程序的shell脚本。该脚本有以下功能:解压zip+启动jar包启动jar包停止对应的jar运行重启jar程序目前shell封装了两种方式启动jar命令:java-cpjava-jar如图命令格式:查看所有shell代码:#!/usr/bin/envbash#可变参数变量languageType="javac"#支持java,javac,netcore发布#参数值通过pom文件传递baseZipName="${package-name}-${activeProfile}"#压缩包名publish-test.zip的publishpackageName="${package-name}"#命令启动包名xx.jar的xxmainclass="${boot-main}"#java-cp启动,指定主入口类;命令:java-cpconf;lib\*.jar;${packageName}.jar${mainclass}#Example#baseZipName="publish-test"#压缩包名称publish-test.zippublish#packageName="publish"#Command开始包名publishxxof.jar#fixedvariablebasePath=$(cd`dirname$0`/;pwd)baseZipPath="${basePath}/${baseZipName}.zip"#压缩包路径baseDirPath="${basePath}"#decompressiondeploymentDiskpathpid=#processpid#unzipfunctionshenniu_unzip(){echo"unzip----------------------------------------------"echo"压缩包路径:${baseZipPath}"if[!`find${baseZipPath}`]thenecho"不存在压缩包:${baseZipPath}“elseecho”解压磁盘路径:${baseDirPath}/${baseZipName}"echo"开始解压..."#解压命令unzip-od${baseDirPath}/${baseZipName}${baseZipPath}#设置执行权限chmod+x${baseDirPath}/${baseZipName}/${packageName}echo"解压完成"fi}#detectionpidfunctiongetPid(){echo"检测状态---------------------------------------------"pid=`ps-ef|grep-n${packageName}|grep-vgrep|awk'{print$2}'`if[${pid}]thenecho"运行pid:${pid}"elseecho"isnotrunning"fi}#Startupprogramfunctionstart(){#启动前,停止前面的stopif[${pid}]thenecho"stop程序失败,无法启动"elseecho"启动程序已开始---------------------------------------------"#selectlanguagetyperead-p"inputProgramtype(java,javac,netcore),然后回车(默认:${languageType}):"read_languageTypeif[${read_languageType}]thenlanguageType=${read_languageType}fiecho"选择程序类型:${languageType}"#进入运行包目录cd${baseDirPath}/${baseZipName}#开始分类if["${languageType}"=="javac"]thenif[${mainclass}]thennohupjava-cpconf:lib\*.jar:${packageName}.jar${mainclass}>${baseDirPath}/${packageName}.out2>&1&#nohupjava-cpconf:lib\*.jar:${packageName}.jar${mainclass}>/开发/空l2>&1&fielif["${languageType}"=="java"]thennohupjava-jar${baseDirPath}/${baseZipName}/${packageName}.jar>/dev/null2>&1&#java-jar${baseDirPath}/${baseZipName}/${packageName}.jarelif["${languageType}"=="netcore"]then#nohupdotnetrun${baseDirPath}/${baseZipName}/${packageName}>/dev/null2>&1&nohup${baseDirPath}/${baseZipName}/${packageName}>/dev/null2>&1&fi#查询是否有启动进程getPidif[${pid}]thenecho"started"#nohuplogtail-n50-f${baseDirPath}/${packageName}.outelseecho"failedtostart"fifi}#stopprogramfunctionstop(){getPidif[${pid}]thenecho"停止程序------------------------------------------"kill-9${pid}getPidif[${pid}]then#stopecho"停止失败"elseecho"停止成功"fifi}#带参数启动,根据参数执行if[${#}-ge1]thencase${1}in"start")start;;"restart")start;;"stop")stop;;"unzip")#执行解压shenniu_unzip#executestartstart;;*)echo"${1}无操作";;esacelseecho"命令如下:unzip:解压并启动start:startstop:停止进程restart:重启Ex充足的命令,例如:./shenniu_publishstart"fi上一节提到,shell中的参数package-name、activeProfile、boot-main都是mvn中profiles的属性提供的,都是可变参数,脚本代码本身不需要手动修改,只需要改mvn的参数就可以了;其实我们在生成zip包的时候,shell里面的参数就被替换掉了,在zip里面可以看到shell文件的内容,比如:上传生成zip到linux,通过命令解压:1unzip-odeureka-server-0.0.1-nodeeureka-server-0.0.1-node.zip其实shell脚本里面有解压命令,不过我在zip的时候放了打包,所以只能手动解压,当然可以调整;此时进入加压目录如下:注意:第一次执行./shenniu_publish.sh脚本时,会提示错误信息;这是因为我在windows上编辑了这个脚本,它的空格是不同的与Linux上的那些不同。因此,运行中会出现问题。解决方法可以在linux中使用vim命令将文件转成linux格式。如下命令:1vimshenniu_publish.sh2setff=unix3:wq执行后,运行脚本./shenniu_publish.sh,此时有如下提示:此时我们的文件已经解压,所以只需要start命令即可启动程序:到这里就完成了shenniu_publish.sh脚本的使用,只要脚本不提示错误,jar服务基本就可以启动了;其他的restart和stop命令也是这样执行的希望这个脚本能给大家带来效率和好的学习思路。下面是测试用例的git地址。脚本在eureka-server项目中:https://github.com/shenniubuxing3/springcloud-Finchley.SR2