信息发布→ 登录 注册 退出

我们公司使用了 6 年的Spring Boot 项目部署方案!打包 + Shell 脚本部署详解,稳的一批!

发布时间:2025-07-11

点击量:

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

原创 | Java 2025 超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数据库中间件 Sharding-JDBC 和 MyCAT 源码解析作业调度中间件 Elastic-Job 源码解析分布式事务中间件 TCC-Transaction 源码解析Eureka 和 Hystrix 源码解析Java 并发源码

来源:cnblogs.com/wangrudong003

/p/10502043.html

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

本篇和大家分享的是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中配置如下内容:

代码语言:javascript代码运行次数:0运行复制
 1      2          3             node 4              5                  6                 node 7                 ${scripts_packageName} 8                 ${scripts_bootMain} 9             10             11                 true12             13         14         15             node116             17                 node118                 ${scripts_packageName}19                 ${scripts_bootMain}20             21         22         23             node224             25                 node226                 ${scripts_packageName}27                 ${scripts_bootMain}28             29         30     

节点粗解:

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的配置如:

代码语言:javascript代码运行次数:0运行复制
 1             2                 org.apache.maven.plugins 3                 maven-jar-plugin 4                 2.6 5                  6                      7                         false 8                          9                             true10                             lib/11                             ${scripts_bootMain}12                         13                     14                     15                     16                         **/*.yml17                         **/*.properties18                         **/*.xml19                         **/*.sh20                     21                 22                 23                     24                         make-a-jar25                         compile26                         27                             jar28                         29                     30                 31             3233             34                 org.apache.maven.plugins35                 maven-assembly-plugin36                 2.437                 38                 39                     40                     41                         ${project.basedir}/src/main/assembly/assembly.xml42                     43                 44                 45                     46                         make-assembly47                         package48                         49                             single50                         51                     52                 53             

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

mainClass节点:用来指定启动main函数入口类路径,如这里的:com.sm.EurekaServerApplicationexcludes节点:排除主jar包中配置等一些列后缀文件,因为我们要包这些配置文件放到主包外面descriptor节点:用来指定assembly插件对应的assembly.xml配置文件

有了上面mvn配置,我们还需要assembly.xml的配置,这里提取了结合shell脚本发布程序的配置:

代码语言:javascript代码运行次数:0运行复制
 1  4     ${activeProfile} 5      6      7         zip 8      9     10     false11     12         13             14             false15             ${package-name}-${activeProfile}/lib16             false17         18     1920     21         22         23             ${project.basedir}/src/main/profiles/${activeProfile}24             ${package-name}-${activeProfile}/conf25             26                 **/*27                 28                 29                 30             31         3233         34         35             ${project.basedir}/src/main/scripts36             37             38                 **/*39             40             41             77742             43             77744             45             true46         4748         49         50             ${project.build.directory}51             ${package-name}-${activeProfile}/52             53                 *.jar54             55         56     57 

重点节点介绍:

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

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

分享shenniu_publish.sh程序启动工具

上面步骤完成了zip格式的发布包,我们再分享下启动程序的shell脚本,该脚本具有的功能如:

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

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

java -cpjava -jar

如图命令格式:

来看全部的shell代码:

代码语言:javascript代码运行次数:0运行复制
  1 #!/usr/bin/env bash  2 #可变参数变量  3 languageType="javac" #支持 java,javac,netcore 发布  4 #参数值由pom文件传递  5 baseZipName="${package-name}-${activeProfile}" #压缩包名称  publish-test.zip的publish  6 packageName="${package-name}" #命令启动包名 xx.jar的xx  7 mainclass="${boot-main}" #java -cp启动时,指定main入口类;命令:java -cp conf;lib\*.jar;${packageName}.jar ${mainclass}  8  9 #例子 10 # baseZipName="publish-test" #压缩包名称  publish-test.zip的publish 11 # packageName="publish" #命令启动包名 publish.jar的xx 12 13 #固定变量 14 basePath=$(cd `dirname $0`/; pwd) 15 baseZipPath="${basePath}/${baseZipName}.zip"  #压缩包路径 16 baseDirPath="${basePath}" #解压部署磁盘路径 17 pid= #进程pid 18 19 #解压 20 function shenniu_unzip() 21 { 22     echo "解压---------------------------------------------" 23     echo "压缩包路径:${baseZipPath}" 24     if [ ! `find ${baseZipPath}` ] 25     then 26         echo "不存在压缩包:${baseZipPath}" 27     else 28         echo "解压磁盘路径:${baseDirPath}/${baseZipName}" 29         echo "开始解压..." 30 31         #解压命令 32         unzip -od ${baseDirPath}/${baseZipName} ${baseZipPath} 33 34         #设置执行权限 35         chmod +x ${baseDirPath}/${baseZipName}/${packageName} 36 37         echo "解压完成。" 38     fi 39 } 40 41 #检测pid 42 function getPid() 43 { 44     echo "检测状态---------------------------------------------" 45     pid=`ps -ef | grep -n ${packageName} | grep -v grep | awk '{print $2}'` 46     if [ ${pid} ] 47     then 48         echo "运行pid:${pid}" 49     else 50         echo "未运行" 51     fi 52 } 53 54 #启动程序 55 function start() 56 { 57     #启动前,先停止之前的 58     stop 59     if [ ${pid} ] 60     then 61         echo "停止程序失败,无法启动" 62     else 63         echo "启动程序---------------------------------------------" 64 65         #选择语言类型 66         read -p "输入程序类型(java,javac,netcore),下一步按回车键(默认:${languageType}):" read_languageType 67         if [ ${read_languageType} ] 68         then 69             languageType=${read_languageType} 70         fi 71         echo "选择程序类型:${languageType}" 72 73         #进入运行包目录 74         cd ${baseDirPath}/${baseZipName} 75 76         #分类启动 77         if [ "${languageType}" == "javac" ] 78         then 79             if [ ${mainclass} ] 80             then 81                 nohup java -cp conf:lib\*.jar:${packageName}.jar ${mainclass} >${baseDirPath}/${packageName}.out 2>&1 & 82                #nohup java -cp conf:lib\*.jar:${packageName}.jar ${mainclass} >/dev/null 2>&1 & 83             fi 84         elif [ "${languageType}" == "java" ] 85         then 86             nohup java -jar ${baseDirPath}/${baseZipName}/${packageName}.jar >/dev/null 2>&1 & 87             # java -jar ${baseDirPath}/${baseZipName}/${packageName}.jar 88         elif [ "${languageType}" == "netcore" ] 89         then 90             #nohup dotnet run ${baseDirPath}/${baseZipName}/${packageName} >/dev/null 2>&1 & 91             nohup ${baseDirPath}/${baseZipName}/${packageName} >/dev/null 2>&1 & 92         fi 93 94         #查询是否有启动进程 95         getPid 96         if [ ${pid} ] 97         then 98             echo "已启动" 99             #nohup日志100             tail -n 50 -f ${baseDirPath}/${packageName}.out101         else102             echo "启动失败"103         fi104     fi105 }106107 #停止程序108 function stop()109 {110     getPid111     if [ ${pid} ]112     then113         echo "停止程序---------------------------------------------"114         kill -9 ${pid}115116         getPid117         if [ ${pid} ]118         then119             #stop120             echo "停止失败"121         else122             echo "停止成功"123         fi124124     fi125 }126127 #启动时带参数,根据参数执行128 if [ ${#} -ge 1 ]129 then130     case ${1} in131         "start")132             start133         ;;134         "restart")135             start136         ;;137         "stop")138             stop139         ;;140         "unzip")141             #执行解压142             shenniu_unzip143             #执行启动144             start145         ;;146         *)147             echo "${1}无任何操作"148         ;;149     esac150 else151     echo "152     command如下命令:153     unzip:解压并启动154     start:启动155     stop:停止进程156     restart:重启157158     示例命令如:./shenniu_publish start159     "160 fi

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

linux上使用shenniu_publish.sh启动程序

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

代码语言:javascript代码运行次数:0运行复制
1 unzip -od eureka-server-0.0.1-node eureka-server-0.0.1-node.zip

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

注:这里第一次执行./shenniu_publish.sh脚本时候,提示了错误信息;是由于我是在windows上编辑的这个脚本,其空格等和linux上不一样,所以运行会有问题,要解决可以使用vim命令在linux把该文件转成linux格式,如下命令:

代码语言:javascript代码运行次数:0运行复制
1 vim shenniu_publish.sh2 set ff=unix3 :wq

执行完后,再来运行脚本./shenniu_publish.sh,此时有如下提示:

此刻我们文件是解压状态,因此只需要start命令启动程序即可:

到这里shenniu_publish.sh脚本使用就完成了,只要脚本没有提示错误,基本都能启动jar服务;其他restart和stop命令也如此执行就行:

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



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

已在知识星球更新源码解析如下:

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

代码语言:javascript代码运行次数:0运行复制
文章有帮助的话,在看,转发吧。谢谢支持哟 (*^__^*)
标签:# rpc  # 封装  # xml  # 并发  # github  # vim  # idea  # eureka  # 数据库  # rocketmq  # https  # websocket  # dubbo  # 压缩包  # 配置文件  # 的是  # 两种  # 只需要  # 如图  # 重启  # 启动时  # 就可以  # 量为  # JavaScript  # redis  # git  # windows  # apache  # mongodb  # 工具  # ai  # shell脚本  # red  # Java  # linux  # spring  # rabbitmq  # spring boot  # 架构  # 分布式  # 中间件  # hystrix  # maven  # kafka  # mybatis  
在线客服
服务热线

服务热线

4008888355

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!