这篇文章就是给大家分享SpringBoot打包部署结合Shell脚本命令。重点是分享一个shell程序启动工具,希望对工作有所帮助;配置文件指定不同环境的配置。程序启动工具在Linux上使用shenniu_publish.sh启动程序配置文件来指定不同环境的配置。通常,一套程序被划分为多个部署环境:开发、测试、uat、在线等,如果我们要区分这些环境的配置文件,可以通过两种方式:在应用程序中通过编码指定profile.active=uat.yml并指定mvn中的profiles用于区分不同环境对应的配置文件夹。在idea中针对不同环境手动检查并生成包(推荐)。这里我们要的是第二种,首先在mvn中配置如下内容:node节点${scripts_packageName}${scripts_bootMain}true激活>node1node1${scripts_packageName}${scripts_bootMain}node2node2<包名>${scripts_packageName}${scripts_bootMain}节点粗略的解决方法:id:用来指定不同环境配置文件所在的目录位于,如下:properties:这个节点中的节点可以作为参数传递给其他配置文件,比如这里的package-name节点值可以通过${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-plugin2.6false<清单t>truelib/${scripts_bootMain}**/*.yml**/*.properties**/*.xml**/*.shmake-a-jar编译jarorg.apache.maven.pluginsmaven-assembly-plugin2.4${project.basedir}/src/main/assembly/assembly.xmlmake-assembly包single值得注意的点如下:mainClass节点:用于指定启动main函数的入口类路径,如这里:com.sm.EurekaServerApplicationexcludesnode:排除主jar包中的configuration等一些后缀文件,因为我们要将这些配置文件打包放在主包之外。descriptor节点:用于指定assembly插件对应的assembly.xml配置文件。mvn的配置,我们还需要assembly.xml的配置,这里是结合shell脚本发布程序的配置:${activeProfile}压缩格式>格式s>falsefalse${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包成什么文件格式,这里可以是:zip,tar等。fileMode节点:指定scripts目录下的脚本文件(这里:shenniu_publish.sh),linux上的文件权限是777filtered节点:参数变量在脚本中是pom配置文件中的属性值(此配置我s将mvn中的属性值映射生成到sh文件中,如:${package-name})完成以上配置后,我们可以通过勾选创建zip包的idea来切换不同的环境,如图图:分享shenniu_publish.sh程序启动工具。以上步骤完成了zip格式的发布包。我下面分享一下启动程序的shell脚本。脚本有如下功能:解压zip+启动jar包启动jar包停止相应的jarrun重启jar程序目前shell封装了两种方式启动jar命令:java-cpjava-jar如图图中命令格式:看看所有的shell代码:#!/usr/bin/envbash#可变参数变量languageType="javac"#支持java,javac,netcorerelease#参数值由pom文件传递baseZipName="${package-name}-${activeProfile}"#压缩包名publish-test.zippublishpackageName="${package-name}"#命令启动包名xx.jarxxmainclass="${boot-main}"#java-cp启动时,指定主入口类;命令:java-cpconf;lib\*.jar;${packageName}.jar${mainclass}#Example#baseZipName="publish-test"#压缩包名publish-test.zip的publish#packageName="publish"#command启动包名publish.jar的xx#fixedvariablebasePath=$(cd`dirname$0`/;pwd)baseZipPath="${basePath}/${baseZipName}.zip"#压缩包路径baseDirPath="${basePath}"#解压部署盘路径pid=#进程pid#解压函数shenniu_unzip(){echo"解压------------------------------------------"echo"压缩包路径:${baseZipPath}"if[!`find${baseZipPath}`]thenecho"Noarchive:${baseZipPath}"elseecho"Unzipdiskpath:${baseDirPath}/${baseZipName}"echo"tostartdecompression..."#解压命令unzip-od${baseDirPath}/${baseZipName}${baseZipPath}#设置执行权限chmod+x${baseDirPath}/${baseZipName}/${packageName}echo"解压完成。"fi}#DetectpidfunctiongetPid(){echo"检测状态------------------------------------------"pid=`ps-ef|grep-n${packageName}|grep-vgrep|awk'{print$2}'`if[${pid}]thenecho"runningpid:${pid}"elseecho"isnotrunning"fi}#Startprogramfunctionstart(){#启动前,停止前面的stopif[${pid}]thenecho"stopprogramfailed,unabletostart"elseecho"startprogram---------------------------------------------"#selectlanguagetyperead-p"输入程序类型(java、javac、netcore),下一步回车(默认:${languageType}):"read_languageTypeif[${read_languageType}]thenlanguageType=${read_languageType}fiecho"Selectprogramtype:${languageType}"#进入运行包目录cd${baseDirPath}/${baseZipName}#开始分类if["${languageType}"=="javac"]thenif[${mainclass}]thennohupjava-cpconf:lib\*.jar:${packageName}.jar${mainclass}>${baseDirPath}/${packageName}.out2>&1nohupjava-cpconf:lib\*.jar:${packageName}.jar${mainclass}>/dev/null2>&1&fielif["${languageType}"=="java"]thennohupjava-jar${baseDirPath}/${baseZipName}/${packageName}.jar>/dev/null2>&1java-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}#停止程序functionstop(){getPidif[${pid}]thenecho"停止程序-------------------------------------------"kill-9${pid}getPidif[${pid}]then#stopecho"停止失败"elseecho"停止成功"fifi}#带参数开始,执行根据参数if[${#}-ge1]thencase${1}in"start")start;;"restart")start;;"stop")stop;;"unzip")#Executeunzipshenniu_unzip#Executestartstart;;*)echo"${1}hasnooperation";;esacelseecho"command以下命令:unzip:解压并启动start:开始stop:停止进程restart:Restart示例命令如:./shenniu_publishstart"fi上一节讲到,shell中的参数package-name、activeProfile、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服务;其他的restart和stop命令也可以用同样的方式执行:你可以研究shell代码,希望这个脚本能给你带来效率和好的学习思路,下面是测试用例的git地址,脚本在eureka-在服务器项目中:https://github.com/shenniubuxing3/springcloud-Finchley.SR2