网易首页 > 网易号 > 正文 申请入驻

用了6年SpringBoot部署方案!打包+Shell 脚本部署详解,稳的一批!

0
分享至

Java精选面试题 (微信小程序): 5000+ 道面试题和选择题, 真实面经 , 简历模版 ,包含Java基础、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设计、大厂真题等,在线随时刷题!

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

1. profiles指定不同环境的配置

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

  • 通过application.yml中编码指定 profile.active=uat 方式指定

  • 通过mvn中profiles来区分不同环境对应的配置文件夹,人工可以手动在idea勾选生成不同环境的包(推荐)

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

 1     

  2         

  3             

 node id>  4             

  5                   6                 

 node activeProfile>  7                 

 ${scripts_packageName} package-name>  8                 

 ${scripts_bootMain} boot-main>  9              properties> 10             

 11                 

 true activeByDefault> 12              activation> 13          profile> 14         

 15             

 node1 id> 16             

 17                 

 node1 activeProfile> 18                 

 ${scripts_packageName} package-name> 19                 

 ${scripts_bootMain} boot-main> 20              properties> 21          profile> 22         

 23             

 node2 id> 24             

 25                 

 node2 activeProfile> 26                 

 ${scripts_packageName} package-name> 27                 

 ${scripts_bootMain} boot-main> 28              properties> 29          profile> 30      profiles>




















节点粗解:

  • id:用来指定不同环境配置文件所在的目录,如下我这里:

  • properties:该节点中的节点是可作为参数传递给其他配置文件,如我这里的package-name节点值就可以在另外的assembly.xml或者shell脚本文件中通过${package-name}获取到,如下:

  • activeByDefault:指定默认环境配置文件夹

2. maven-assembly-plugin打发布压缩包

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

 1            

  2                 

 org.apache.maven.plugins groupId>  3                 

 maven-jar-plugin artifactId>  4                 

 2.6 version>  5                 

  6                     

  7                         

 false addMavenDescriptor>  8                         

  9                             

 true addClasspath> 10                             

 lib/ classpathPrefix> 11                             

 ${scripts_bootMain} mainClass> 12                          manifest> 13                      archive> 14                      15                     

 16                         

 **/*.yml exclude> 17                         

 **/*.properties exclude> 18                         

 **/*.xml exclude> 19                         

 **/*.sh exclude> 20                      excludes> 21                  configuration> 22                 

 23                     

 24                         

 make-a-jar id> 25                         

 compile phase> 26                         

 27                             

 jar goal> 28                          goals> 29                      execution> 30                  executions> 31              plugin> 32 33             

 34                 

 org.apache.maven.plugins groupId> 35                 

 maven-assembly-plugin artifactId> 36                 

 2.4 version> 37                  38                 

 39                      40                     

 41                         

 ${project.basedir}/src/main/assembly/assembly.xml descriptor> 42                      descriptors> 43                  configuration> 44                 

 45                     

 46                         

 make-assembly id> 47                         

 package phase> 48                         

 49                             

 single goal> 50                          goals> 51                      execution> 52                  executions> 53              plugin>


































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

  • mainClass节点:用来指定启动main函数入口类路径,如这里的:com.sm.EurekaServerApplication

  • excludes节点:排除主jar包中配置等一些列后缀文件,因为我们要包这些配置文件放到主包外面

  • descriptor节点:用来指定assembly插件对应的assembly.xml配置文件

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

 1 

  4     

 ${activeProfile} id>  5       6     

  7         

 zip format>  8      formats>  9      10     

 false includeBaseDirectory> 11     

 12         

 13              14             

 false useProjectArtifact> 15             

 ${package-name}-${activeProfile}/lib outputDirectory> 16             

 false unpack> 17          dependencySet> 18      dependencySets> 19 20     

 21          22         

 23             

 ${project.basedir}/src/main/profiles/${activeProfile} directory> 24             

 ${package-name}-${activeProfile}/conf outputDirectory> 25             

 26                 

 **/* include> 27                  28                  29                  30              includes> 31          fileSet> 32 33          34         

 35             

 ${project.basedir}/src/main/scripts directory> 36             

 outputDirectory> 37             

 38                 

 **/* include> 39              includes> 40              41             

 777 fileMode> 42              43             

 777 directoryMode> 44              45             

 true filtered> 46          fileSet> 47 48          49         

 50             

 ${project.build.directory} directory> 51             

 ${package-name}-${activeProfile}/ outputDirectory> 52             

 53                 

 *.jar include> 54              includes> 55          fileSet> 56      fileSets> 57  assembly>




























重点节点介绍:

  • formats节点:把配置文件和jar包等压缩成什么文件格式,这里可以有:zip,tar等

  • fileMode节点:指定scripts目录下脚本文件(这里是:shenniu_publish.sh)在linux上文件权限为777

  • filtered节点:脚本中参数变量为pom的profiles中properties的值(该配置,是把mvn中属性值映射生成到sh文件中,如:${package-name})

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

3. 分享shenniu_publish.sh程序启动工具

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

  • 解压zip+启动jar包

  • 启动jar包

  • 停止对应jar运行

  • 重启jar程序

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

  • java -cp

  • java -jar

如图命令格式:

来看全部的shell代码:

  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}.out
101         else
102             echo "启动失败"
103         fi
104     fi
105 }
106
107  #停止程序 
108 function stop()
109 {
110     getPid
111     if [ ${pid} ]
112     then
113         echo "停止程序---------------------------------------------"
114         kill -9 ${pid}
115
116         getPid
117         if [ ${pid} ]
118         then
119              #stop 
120             echo "停止失败"
121         else
122             echo "停止成功"
123         fi
124     fi
125 }
126
127  #启动时带参数,根据参数执行 
128 if [ ${#} -ge 1 ]
129 then
130     case ${1} in
131         "start")
132             start
133         ;;
134         "restart")
135             start
136         ;;
137         "stop")
138             stop
139         ;;
140         "unzip")
141              #执行解压 
142             shenniu_unzip
143              #执行启动 
144             start
145         ;;
146         *)
147             echo "${1}无任何操作"
148         ;;
149     esac
150 else
151     echo " 152     command如下命令: 153     unzip:解压并启动 154     start:启动 155     stop:停止进程 156     restart:重启 157 158     示例命令如:./shenniu_publish start 159     "
160 fi

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

4. linux上使用shenniu_publish.sh启动程序

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

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格式,如下命令:

1 vim shenniu_publish.sh
2 set ff=unix
3 :wq

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

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

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

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

作者:神牛003 来源:https://www.cnblogs.com/wangrudong003/p/10502043.html

公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!

最近有很多人问,有没有技术或摸鱼交流群!加入方式很简单,公众号Java精选,回复“加群”,即可入群!在线摸鱼:https://www.yoodb.com/

Java精选面试题(微信小程序):3000+道面试题,包含Java基础、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设计等,在线随时刷题!

特别推荐:专注分享最前沿的技术与资讯,为弯道超车做好准备及各种开源项目与高效率软件的公众号,「大咖笔记」,专注挖掘好东西,非常值得大家关注。点击下方公众号卡片关注

文章有帮助的话,点在看,转发吧!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
“姐,你和姐夫复婚吧,咱全家没他不行”姐姐:我不想再做扶弟魔

“姐,你和姐夫复婚吧,咱全家没他不行”姐姐:我不想再做扶弟魔

清水家庭故事
2026-02-20 11:36:13
哈萨克斯坦择偶为啥这么难?仅 2050 万人口,却有50 万女性打光棍!

哈萨克斯坦择偶为啥这么难?仅 2050 万人口,却有50 万女性打光棍!

奇思妙想生活家
2026-02-20 21:25:23
6金稳了?金牌榜大变天:挪威17金创历史,中国队3天4金,美国第2

6金稳了?金牌榜大变天:挪威17金创历史,中国队3天4金,美国第2

林子说事
2026-02-21 07:50:59
“催买房”无效后,国家动真格!2026年起,房地产将出现三个趋势

“催买房”无效后,国家动真格!2026年起,房地产将出现三个趋势

巢客HOME
2026-02-21 10:55:03
贾伦报销无缘战旧主!爵士3人20+仍遭灰熊逆转 孟菲斯8人上双

贾伦报销无缘战旧主!爵士3人20+仍遭灰熊逆转 孟菲斯8人上双

醉卧浮生
2026-02-21 10:37:42
不要轻易做手术!医生提醒:62岁后,这5类手术可尽量避免

不要轻易做手术!医生提醒:62岁后,这5类手术可尽量避免

今日养生之道
2026-02-15 14:14:53
俄方警告欧洲大国:若俄罗斯船只遭扣押,俄方或对欧洲航运实施报复

俄方警告欧洲大国:若俄罗斯船只遭扣押,俄方或对欧洲航运实施报复

闻识
2026-02-21 11:55:35
数百美军士兵从卡塔尔空军基地撤离

数百美军士兵从卡塔尔空军基地撤离

财联社
2026-02-21 09:17:11
被央视怒批、洋相百出、腹中空空,这几位“绝望的文盲”凭啥能火

被央视怒批、洋相百出、腹中空空,这几位“绝望的文盲”凭啥能火

娱说瑜悦
2025-12-13 12:24:22
6场狂造6球 巴西神童新东家彻底爆发 4大英超豪门疯抢 皇马不放人

6场狂造6球 巴西神童新东家彻底爆发 4大英超豪门疯抢 皇马不放人

零度眼看球
2026-02-21 07:33:57
凌晨4点 英超追分之战!曼城赢球=只差榜首2分 2大巨人PK

凌晨4点 英超追分之战!曼城赢球=只差榜首2分 2大巨人PK

叶青足球世界
2026-02-21 08:17:20
做完手术人就废了,这5种手术不需要做,别让无知害了自己

做完手术人就废了,这5种手术不需要做,别让无知害了自己

医学科普汇
2026-01-29 06:25:03
2月21金价:行情拐点已清晰明了,不出意外,金价可能会重演历史

2月21金价:行情拐点已清晰明了,不出意外,金价可能会重演历史

亿通电子游戏
2026-02-21 10:51:52
早已杀青却播出无望的7部剧,部部可惜,尤其是最后一部

早已杀青却播出无望的7部剧,部部可惜,尤其是最后一部

小Q侃电影
2026-01-25 13:16:28
匈外长称将否决欧盟对乌900亿欧元贷款

匈外长称将否决欧盟对乌900亿欧元贷款

界面新闻
2026-02-21 12:27:45
奥运冠军莱尔丹破纪录后露出耐克logo,营销专家预测或获百万美元代言

奥运冠军莱尔丹破纪录后露出耐克logo,营销专家预测或获百万美元代言

懂球帝
2026-02-20 17:12:06
暗戳戳完侯佩岑,暗戳戳田馥甄!咱嫂子,一会发彩虹,一会发风车

暗戳戳完侯佩岑,暗戳戳田馥甄!咱嫂子,一会发彩虹,一会发风车

一盅情怀
2026-02-20 13:06:40
48小时大变脸!美国紧急撤回名单,高市急用简体中文向中国低头

48小时大变脸!美国紧急撤回名单,高市急用简体中文向中国低头

铁锤简科
2026-02-21 00:01:59
31场38球!C罗点评姆巴佩:他不擅长踢中锋,如果我在皇马会教他

31场38球!C罗点评姆巴佩:他不擅长踢中锋,如果我在皇马会教他

夏侯看英超
2026-02-21 00:53:30
俄外交部:日本出资为乌军采购的装备将成为俄军的合法目标

俄外交部:日本出资为乌军采购的装备将成为俄军的合法目标

俄罗斯卫星通讯社
2026-02-20 15:30:33
2026-02-21 13:03:00
Java精选
Java精选
一场永远也演不完的戏
1772文章数 3859关注度
往期回顾 全部

科技要闻

智谱上市1月涨5倍,市值超越京东、快手

头条要闻

牛弹琴:一觉醒来世界大变 真急了的特朗普改新打法

头条要闻

牛弹琴:一觉醒来世界大变 真急了的特朗普改新打法

体育要闻

冬奥第一"海王"?一人和13国选手都有关系

娱乐要闻

镖人反超惊蛰无声拿下单日票房第二!

财经要闻

一觉醒来,世界大变,特朗普改新打法了

汽车要闻

比亚迪的“颜值担当”来了 方程豹首款轿车路跑信息曝光

态度原创

健康
时尚
数码
房产
公开课

转头就晕的耳石症,能开车上班吗?

2026纽约秋冬时装周,在春天开启美的新故事!

数码要闻

苹果低价MacBook下月登场:首次搭载A18 Pro手机芯片!

房产要闻

窗前即地标!独占三亚湾C位 自贸港总裁行宫亮相

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版