当前位置: 首页 > 后端技术 > Java

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

时间:2023-04-02 02:14:20 Java

这篇文章就是给大家分享SpringBoot打包部署结合Shell脚本命令。重点是分享一个shell程序启动工具,希望对工作有所帮助;配置文件指定不同环境的配置。程序启动工具在Linux上使用shenniu_publish.sh启动程序配置文件来指定不同环境的配置。通常,一套程序被划分为多个部署环境:开发、测试、uat、在线等,如果我们要区分这些环境的配置文件,可以通过两种方式:在应用程序中通过编码指定profile.active=uat.yml并在mvn中指定profiles来区分不同环境对应的配置文件夹。在idea中针对不同环境手动检查并生成包(推荐)。这里我们要的是第二种,首先在mvn中配置如下内容:node节点${scripts_packageName}${scripts_bootMain}truenode1node1${scripts_packageName}${scripts_bootMain}node2node2${scripts_packageName}${scripts_bootMain}节点粗略的解决方案:id:用于指定不同环境配置文件所在的目录,如下这里:properties:该节点中的节点可以作为参数传递给其他配置文件。比如这里的package-name节点值可以通过另一个assembly.xml或者shell脚本文件中的${package-name}获取,如下:activeByDefault:指定默认环境配置文件夹maven-assembly-plugin发布压缩包包裹。对于springboot程序打包,可以分为jar和war。这里是jar包;有些场景我们配置文件或者第三方依赖。不想放到工程jar里,把这些文件压缩成zip包,方便上传到linux;这时可以通过maven-assembly-plugin和maven-jar-plugin来完成,mvn的配置如下:org.apache.maven.pluginsmaven-jar-plugin<版本>2.6<配置><归档>falsetruelib/${scripts_bootMain}<排除><排除>**/*.yml<排除>**/*.properties<排除>**/*.xml<排除>**/*.shmake-a-jarcompilejarorg.apache.maven.pluginsmaven-assembly-plugin2.4${project.basedir}/src/main/assembly/assembly.xml<执行><执行>make-assemblypackagesingle值得注意的点如下:mainClass节点:用于指定启动main函数的入口类路径,比如这里:com.sm.EurekaServerApplicationexcludes节点:排除一些后缀文件比如mainjar包中的配置,因为我们要将这些配置文件打包放它们在主包之外。指定assembly插件对应的assembly.xml配置文件。有了上面的mvn配置,我们还需要assembly.xml的配置。这里我们提取配置结合shell脚本发布程序:${activeProfile}<formats>zipfalsefalse${package-name}-${activeProfile}/libfalse${project.basedir}/src/main/profiles/${activeProfile}${package-name}-${activeProfile}/conf**/*${project.basedir}/src/main/scripts**/*777777true${project.build.directory}<outputDirectory>${package-name}-${activeProfile}/*.jar关键节点介绍:formatsnode:配置文件和jar包压缩成什么文件格式,这里可以是:zip,tar等。将mvn中的属性值映射生成到sh文件中,如:${package-name})完成以上配置后,我们可以通过思路,勾选切换不同环境创建zip包,如图图:分享shenniu_publish.sh程序启动工具。以上步骤完成了zip格式的发布包。下面分享一下启动程序的shell脚本。脚本有如下功能:解压zip+启动jar包启动jar包停止对应的jarrun重启jar程序目前shell封装了两种启动jar命令的方式:java-cpjava-jar如图命令格式:查看所有shell代码:#!/usr/bin/envbash#可变参数variablelanguageType="javac"#支持java,javac,netcorepublish#参数值由pom文件传递baseZipName="${package-name}-${activeProfile}"#压缩包名publish-test.zip'spublishpackageName="${package-name}"#命令启动包名xx.jar'sxxmainclass="${boot-main}"#java-cp启动时指定主入口类;命令:java-cpconf;lib\*.jar;${packageName}.jar${mainclass}#Example#baseZipName="publish-test"#压缩包名称publish-test.zippublish#packageName="publish"#命令启动包名称publish.jarxx#固定变量basePath=$(cd`dirname$0`/;pwd)baseZipPath="${basePath}/${baseZipName}.zip"#压缩包路径baseDirPath="${basePath}"#unzip部署盘路径pid=#processpid#unzipfunctionshenniu_unzip(){echo"解压缩--------------------------------------------"echo"压缩包路径:${baseZipPath}"if[!`find${baseZipPath}`]thenecho"Nocompressedpackage:${baseZipPath}"elseecho"解压后的磁盘路径:${baseDirPath}/${baseZipName}"echo"开始解压..."#解压命令unzip-od${baseDirPath}/${baseZipName}${baseZipPath}#设置执行权限chmod+x${baseDirPath}/${baseZipName}/${packageName}echo"解压完成。"fi}#DetectpidfunctiongetPid(){echo"检测状态----------------------------------------"pid=`ps-ef|grep-n${包名}|grep-vgrep|awk'{print$2}'`if[${pid}]thenecho"runningpid:${pid}"elseecho"notrunning"fi}#EnableProgramfunctionstart(){#启动前,停止之前的stopif[${pid}]thenecho"停止程序失败,无法启动"elseecho"启动程序------------------------------------------"#selectlanguagetyperead-p"inputprogramtype(java,javac,netcore),下一步回车(默认:${languageType}):"read_languageTypeif[${read_languageType}]thenlanguageType=${read_languageType}fiecho"Selectprogramtype:${languageType}"#Enter运行包目录cd${baseDirPath}/${baseZipName}#Classificationstartupif["${languageType}"=="javac"]thenif[${mainclass}]thennohupjava-cpconf:lib\*.jar:${packageName}.jar${mainclass}>${baseDirPath}/${packageName}.out2>&1&#nohupjava-cpconf:lib\*.jar:${packageName}.jar${mainclass}>/dev/null2>&1&fielif["${languageType}"=="java"]然后nohupjava-jar${baseDirPath}/${baseZipName}/${packageName}.jar>/dev/null2>&1&#java-jar${baseDirPath}/${baseZipName}/${packageName}.jarelif["${languageType}"=="netcore"]然后#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"startfailed"fifi}#停止程序functionstop(){getPidif[${pid}]thenecho"Stoptheprogram---------------------------------------------"kill-9${pid}getPidif[${pid}]then#stopecho"停止失败"elseecho"停止成功"fifi}#Start带参数,根据参数执行if[${#}-ge1]thencase${1}in"start")开始;;“重启”)开始;;“停止”)停止;;"unzip")#执行解压shenniu_unzip#执行startstart;;*)echo"${1}没有操作";;esacelseecho"命令如下命令:unzip:解压并启动start:startstop:停止进程restart:restart示例命令如:./shenniu_publishstart"fi上一节提到的参数package-name,activeProfile,和shell中的boot-main都是由mvn的profiles的属性中提供的,是可变参数。脚本代码本身不需要手动修改,只需要更改mvn的参数即可;其实我们在生成zip包的时候,将shell中的参数替换掉,可以在zip中看到shell文件的内容,如:将生成的zip上传到linux,通过命令解压:unzip-odeureka-server-0.0.1-nodeeureka-server-0.0.1-node.zip其实在shell脚本里面是有解压命令的,但是我打包的时候放在了zip里面,所以只能解压手动,当然可以调整;此时进入加压目录如下:注意:这是第一次执行./shenniu\_publish.sh编写脚本时,会提示错误信息;是因为我是在windows上编辑这个脚本,它的空间和linux上的不一样,所以运行会有问题。解决方法可以在linux上使用vim命令将文件转成linux格式,命令如下:vimshenniu_publish.shsetff=unix:wq执行后,运行脚本./shenniu_publish.sh,此时有如下提示:此时我们的文件已经解压,所以只需要start命令启动程序:到这里shenniu\_publish.sh脚本的使用就完成了。只要脚本不提示错误,基本就可以启动jar服务了;其他重启和停止命令也可以用同样的方式执行:可以研究一下shell代码,希望脚本能给你带来效率和好的学习思路,下面是测试用例的git地址,脚本在eureka-server项目:https://github.com/shenniubux...作者:神牛003cnblogs.com/wangrudong003/p/10502043.html

猜你喜欢