0

0

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

蓮花仙者

蓮花仙者

发布时间:2025-07-11 09:00:13

|

751人浏览过

|

来源于php中文网

原创

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

管她前浪,还是后浪?

能浪的浪,才是好浪!

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

源码精品专栏

原创 | Java 2021 超神之路,很肝~中文详细注释的开源项目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启动程序
我们公司使用了 6 年的Spring Boot 项目部署方案!打包 + Shell 脚本部署详解,稳的一批!

本篇和大家分享的是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:用来指定不同环境配置文件所在的目录,如下我这里:
我们公司使用了 6 年的Spring Boot 项目部署方案!打包 + Shell 脚本部署详解,稳的一批!
properties:该节点中的节点是可作为参数传递给其他配置文件,如我这里的package-name节点值就可以在另外的assembly.xml或者shell脚本文件中通过${package-name}获取到,如下:
我们公司使用了 6 年的Spring Boot 项目部署方案!打包 + Shell 脚本部署详解,稳的一批!
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包,如图:

我们公司使用了 6 年的Spring Boot 项目部署方案!打包 + Shell 脚本部署详解,稳的一批!
分享shenniu_publish.sh程序启动工具

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

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

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

LobeHub
LobeHub

LobeChat brings you the best user experience of ChatGPT, OLLaMA, Gemini, Claude

下载
java -cpjava -jar

如图命令格式:

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

来看全部的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文件内容如:

我们公司使用了 6 年的Spring Boot 项目部署方案!打包 + 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中,所以只能通过手动解压了,当然可以调整;此时进入加压目录如此:

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

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

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

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

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

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

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

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

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

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



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

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

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

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

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

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

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

代码语言:javascript代码运行次数:0运行复制
文章有帮助的话,在看,转发吧。谢谢支持哟 (*^__^*)

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

841

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

742

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

738

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

397

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

399

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

430

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16926

2023.08.03

Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.5万人学习

Git 教程
Git 教程

共21课时 | 2.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号