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

SpringBoot不同环境打包配置与Shell脚本部署实践,太实用了!

0
分享至

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

  • 个人资料指定不同环境的配置

  • maven-assembly-plugin打发布压缩包

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

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

个人资料指定不同环境的配置

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

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

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

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

1
2
3 node
4
5 <!-传递给脚本的参数值->
6 node
7 $ {scripts_packageName}
8 $ {scripts_bootMain}
9
10
11 true
12
13
14
15 node1
16
17 node1
18 <程序包名称> $ {scripts_packageName}
19 $ {scripts_bootMain}
20
21
22
23 node2
24
25 node2
26 <程序包名称> $ { scripts_packageName}
27 $ {scripts_bootMain}
28
29
30

官员粗解:关于更多内容:https://www.yoodb.com/

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

属性:该例程中的例程是可作为参数传递给其他配置文件,如我这里的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的配置如:

1
2 org.apache.maven.plugins
3 maven-jar-plugin
4 2.6
5
6
7 假
8
9 真
10 lib /
11 $ {scripts_bootMain}
12
13 < / archive>
14 <!-打包排除项->
15
16 ** / *。yml
17 ** / *。属性
18 ** / *。xml
19 ** / *。sh
20
21
22
23
24 make -a -jar
25 compile
26
27 jar < / goal>
28
29
30
31
32
33
34 org.apache.maven.plugins
35 maven-assembly -plugin
36 2.4
37 <!-插件的配置->
38
39 <!-指定程序集插件的配置文件->
40 <描述符>
41 <描述符> $ {project.basedir} /src/main/assembly/assembly.xml
42
43
44
45
46 make-assembly
47 包
48 <目标>
49 <目标>单个
50
51
52
53

如下的地方如下几点:

  • mainClass代理:用于指定启动main函数入口类路径,如此处的:com.sm.EurekaServerApplication

  • 不包括摘要:排除主罐包中配置等一些列后缀文件,因为我们要包这些配置文件放到主包外面

  • 描述符描述符:用于指定程序集插件对应的assembly.xml配置文件

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

“ http://maven.apache.org/ASSEMBLY/2.0.0” xmlns:xsi = “ http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation = “” http:// /maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd
http://maven.apache.org/ASSEMBLY/2.0.0“ >
$ {activeProfile}
<!-打包成一个用于发布的zip文件->

zip

<!- true :zip中生成一级目录(此处屏蔽,配合脚本需要profiles后缀)->
false

<!-打包进来的zip文件的lib目录->

$ {package-name} - $ {activeProfile} / lib
false

<!-配置文件打包进zip文件的配置目录->

<目录> $ {project.basedir} / src / main / profiles / $ {activeProfile}
$ {package-name} - $ {activeProfile} / conf

** / *
<!- *。xml ->
<!- *。properties ->
<!- *。yml ->

<!-启动脚本打包进zip文件->

<目录> $ {project.basedir} / src / main / scripts

<!-文件文件权限为777->
777
<!-目录权限为777->
777
<!-脚本中参数变量为pom中的值关键->
true

<!-项目编译出来的jar打包进zip文件->

$ {project.build.directory}
$ {package-name} - $ { activeProfile } /

*。jar < / include>

重点介绍:

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

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

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

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

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

  • 解压zip +启动jar包

  • 启动jar包

  • 停止对应jar运行

  • 重启jar程序

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

  • java -cp

  • java -jar

如命令格式:

来看全部的shell代码:

#!/ usr / bin / env bash
#可变参数变量
languageType = “ javac” #支持java,javac,netcore发布
#参数值由pom文件传递
baseZipName = “” $ {package-name} - $ {activeProfile} “ #压缩包名称publish-test.zip的
packagename = “ $ {package-name} ” #命令启动包名xx.jar的xx
mainclass = “” $ {boot-main} “ #java -cp启动时,指定main入口类;命令:java -cp conf; lib \ *。jar; $ {packageName} .jar $ {mainclass}

#例子
#baseZipName =“ publish-test”#压缩包名称publish-test.zip的发布
#packageName =“ publish”。罐子的XX

#固定变量
基本路径= $( 光盘 `目录名称 $ 0 `/; pwd )
baseZipPath = “” $ {basePath} / $ {baseZipName} .zip“ #压缩包路径
baseDirPath = ”“ $ {basePath} ” #解压部署磁盘路径
pid = #进程pid

#解压
功能 shenniu_unzip ()
{
echo “解压- --------------------------------------------“
echo ”压缩包路径:$ {baseZipPath} “
如果 [!`find $ {baseZipPath} `]
然后
回显 “不存在压缩包:$ {baseZipPath} ”
else
echo “解压磁盘路径:$ {baseDirPath} /$ {baseZipName} “
echo ”开始解压...“

#解压命令
unzip -od $ {baseDirPath} / $ {baseZipName} $ {baseZipPath}

#设置执行权限
chmod + x $ {baseDirPath} / $ {baseZipName} / $ {packageName}

echo “解压完成。”
fi
}

#检测pid
function getPid ()
{
echo “检测状态--------------------------- ------------------“
pid =`ps -ef | grep -n $ {packageName} | grep -v grep | awk '{print $ 2}' `
if [ $ {pid} ]
然后
回显 “运行pid:$ {pid} ”
else
echo “未运行”
fi
}

#启动程序
function start ()
{
#启动前,先停止之前的
stop
if [ $ {pid} ]
then
echo “停止程序失败,无法启动“
else
echo ”启动程序-------------------------------------------- -“

#选择语言类型
read -p ”输入程序类型(java,javac,netcore),继续按回车键(要么:$ {languageType}):“ read_languageType
如果 [ $ {read_languageType} ]

languageType = $ { read_languageType}
fi
echo “选择程序类型:$ {languageType} ”

#进入运行包目录
cd $ {baseDirPath} / $ {baseZipName}

#分类启动
if [ “ $ {languageType} ” == “ javac” ]

if [ $ {mainclass} ]
然后
nohup java -cp conf:lib \ *。jar: $ {packageName} .jar $ {mainclass} > $ {baseDirPath} / $ {packageName} .out 2>&1&
#nohup java -cp conf:lib \ *的.jar:$ {的packageName}的.jar $ {mainclass}>的/ dev / null的2>&1&
音响
的elif [ “$ {languageType} “ == ” java“ ]
然后
nohup java -jar $ {baseDirPath} / $ {baseZipName} / $ {packageName} .jar> / dev / null 2>&1&
#java -jar $ {baseDirPath} / $ {baseZipName} / $ {packageName} .jar
elif [ “ $ {languageType} ” == “ netcore” ]
然后
#nohup dotnet运行$ {baseDirPath} / $ {baseZipName} / $ {packageName}> / dev / null 2 >&1&
nohup $ {baseDirPath} / $ {baseZipName} / $ {packageName} > / dev / null 2>&1&
fi

#查询是否有启动进度
getPid
如果 [ $ {PID} ]
然后
回声 “已启动”
#nohup日志
尾-n 50 -f $ {baseDirPath} / $ {的packageName} .OUT
别的
回声 “启动失败”
科幻
音响
}

#停止程序
功能 停止 ()
{
getPid
if [ $ {pid} ]
然后
回显 “停止程序------------------------------------- --------“
kill -9 $ {pid}

getPid
如果 [ $ {pid} ]

#stop
echo ”停止失败“
else
echo “停止成功”
fi
fi
}

#启动时带参数,根据参数执行
if [ $ {#} -ge 1]
然后
case $ {1} in
“ start” )
start
;;
“ restart” )
开始
;;
“ stop” )
停止
;;
“ unzip” )
#执行解压
shenniu_unzip
#执行启动
start
;;
*)
echo “ $ {1}无任何操作”
;;

command如下命令:
解压缩:解压并启动
start:启动
stop:停止进程
重启:重启

示例命令如:./ shenniu_publish start

fi

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

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

1解压缩-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 设置 ff = unix
3:wq

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

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

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

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

作者:Flag Counter cnblogs.com/wangrudong003/p/10502043.html

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

最近有很多人问,有没有读者交流群!加入方式很简单,公众号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-06-28 12:35:47
五角大楼承认低估中国:600枚高超音速导弹,比预估多一倍

五角大楼承认低估中国:600枚高超音速导弹,比预估多一倍

止戈军是我
2026-06-28 17:17:44
避嫌五年,如今肖战杨紫白玉兰再次同台,恋爱传闻也早真相大白

避嫌五年,如今肖战杨紫白玉兰再次同台,恋爱传闻也早真相大白

一盅情怀
2026-06-28 13:57:35
为什么“地下停车位”突然没人买了?内行人说出实情,恍然大悟

为什么“地下停车位”突然没人买了?内行人说出实情,恍然大悟

笑熬浆糊111
2026-05-19 00:05:12
燃气最大隐患不是漏气!是你每天的3个习惯,看完赶紧改

燃气最大隐患不是漏气!是你每天的3个习惯,看完赶紧改

朗威谈星座
2026-06-27 12:40:21
泰国租妻产业年赚数十亿美元,退休老头:租一个妻子,买一段晚年

泰国租妻产业年赚数十亿美元,退休老头:租一个妻子,买一段晚年

星星会坠落
2026-06-24 09:29:50
又一艘油轮遇袭,霍尔木兹海峡威胁等级被上调!打击中东地区美军多个目标后,伊朗最高领袖军事顾问:将有力回应违反谅解备忘录行为

又一艘油轮遇袭,霍尔木兹海峡威胁等级被上调!打击中东地区美军多个目标后,伊朗最高领袖军事顾问:将有力回应违反谅解备忘录行为

每日经济新闻
2026-06-27 20:38:38
普通家庭存款300万,完全够了。

普通家庭存款300万,完全够了。

老陆不老
2026-06-28 08:41:29
佛得角足协做出重要决定!未来将计划跟国足安排热身赛,值得期待

佛得角足协做出重要决定!未来将计划跟国足安排热身赛,值得期待

张丽说足球
2026-06-28 16:49:44
布朗瞬间不香了!两届FMVP遭哄抢,球队不想交易,外界还疯狂报价

布朗瞬间不香了!两届FMVP遭哄抢,球队不想交易,外界还疯狂报价

你的篮球频道
2026-06-28 10:51:37
终于弄明白了为什么开空调蚊子就不咬了——不是蚊子被冻着了,也不是蚊子不想咬,而是蚊子的“导航系统”失灵了

终于弄明白了为什么开空调蚊子就不咬了——不是蚊子被冻着了,也不是蚊子不想咬,而是蚊子的“导航系统”失灵了

二胡的岁月如歌
2026-06-27 15:11:11
大佬减仓了。。

大佬减仓了。。

格隆汇
2026-06-28 13:45:06
庆余年3官宣筹备中,腾讯发布会揭晓最新进展

庆余年3官宣筹备中,腾讯发布会揭晓最新进展

手工制作阿歼
2026-06-28 14:59:05
阿根廷卫冕之路浮现!避开死亡半区,先战佛得角,半决赛或战巴英

阿根廷卫冕之路浮现!避开死亡半区,先战佛得角,半决赛或战巴英

奥拜尔
2026-06-28 12:38:15
“手上不停,嘴上骂老板都行”,广东一工厂招工玩梗出圈,引热议

“手上不停,嘴上骂老板都行”,广东一工厂招工玩梗出圈,引热议

火山詩话
2026-06-28 11:38:22
普京公开表态,全球只有四国能造飞机发动机,中国不在名单之上

普京公开表态,全球只有四国能造飞机发动机,中国不在名单之上

嘻嘻笑
2026-06-28 00:42:59
52岁退休母亲给女儿带娃,5个月后小腹变大,女儿得知真相懵了

52岁退休母亲给女儿带娃,5个月后小腹变大,女儿得知真相懵了

秋风专栏
2025-03-05 12:39:26
静安又添全新商业地标!静安大宁时光里今日开业

静安又添全新商业地标!静安大宁时光里今日开业

上海静安
2026-06-28 16:10:36
原来他就是迟蓬的丈夫,是我们熟悉的资深大导演,公公是电影明星

原来他就是迟蓬的丈夫,是我们熟悉的资深大导演,公公是电影明星

一盅情怀
2026-06-28 13:18:54
全球首款0.7nm芯片发布!国产还怎么追?

全球首款0.7nm芯片发布!国产还怎么追?

牲产队
2026-06-26 17:44:56
2026-06-28 18:19:00
Java精选
Java精选
一场永远也演不完的戏
1795文章数 3859关注度
往期回顾 全部

科技要闻

DeepSeek最新论文:如何让大模型跑得更快

头条要闻

中央巡视后不久副部级官员任上落马 其上任不到一年半

头条要闻

中央巡视后不久副部级官员任上落马 其上任不到一年半

体育要闻

韩国可算确定被淘汰了

娱乐要闻

曾沛慈拿下《乘风2026》年度总冠军

财经要闻

两只股票撑起的韩国股市,半年熔断 33 次

汽车要闻

蔚来ES大五座体验 全场景行李舱让你带着生活出发

态度原创

家居
旅游
教育
公开课
军事航空

家居要闻

绿意盎然 自然之境

旅游要闻

海岛风吹进老洋房!崇明文旅嘉年华亮相思南公馆

教育要闻

要看录取线,也要看平均分!明后天来成都官方“中招会”,这些准备要做好

公开课

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

军事要闻

特朗普又发文威胁:伊朗将不复存在

无障碍浏览 进入关怀版