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运行复制
<code class="javascript"> 1     <profiles> 2         <profile> 3             <id>node</id> 4             <properties> 5                 <!--传递给脚本的参数值--> 6                 <activeProfile>node</activeProfile> 7                 <package-name>${scripts_packageName}</package-name> 8                 <boot-main>${scripts_bootMain}</boot-main> 9             </properties>10             <activation>11                 <activeByDefault>true</activeByDefault>12             </activation>13         </profile>14         <profile>15             <id>node1</id>16             <properties>17                 <activeProfile>node1</activeProfile>18                 <package-name>${scripts_packageName}</package-name>19                 <boot-main>${scripts_bootMain}</boot-main>20             </properties>21         </profile>22         <profile>23             <id>node2</id>24             <properties>25                 <activeProfile>node2</activeProfile>26                 <package-name>${scripts_packageName}</package-name>27                 <boot-main>${scripts_bootMain}</boot-main>28             </properties>29         </profile>30     </profiles></code>

节点粗解:

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运行复制
<code class="javascript"> 1            <plugin> 2                 <groupId>org.apache.maven.plugins</groupId> 3                 <artifactId>maven-jar-plugin</artifactId> 4                 <version>2.6</version> 5                 <configuration> 6                     <archive> 7                         <addMavenDescriptor>false</addMavenDescriptor> 8                         <manifest> 9                             <addClasspath>true</addClasspath>10                             <classpathPrefix>lib/</classpathPrefix>11                             <mainClass>${scripts_bootMain}</mainClass>12                         </manifest>13                     </archive>14                     <!--打包排除项-->15                     <excludes>16                         <exclude>**/*.yml</exclude>17                         <exclude>**/*.properties</exclude>18                         <exclude>**/*.xml</exclude>19                         <exclude>**/*.sh</exclude>20                     </excludes>21                 </configuration>22                 <executions>23                     <execution>24                         <id>make-a-jar</id>25                         <phase>compile</phase>26                         <goals>27                             <goal>jar</goal>28                         </goals>29                     </execution>30                 </executions>31             </plugin>3233             <plugin>34                 <groupId>org.apache.maven.plugins</groupId>35                 <artifactId>maven-assembly-plugin</artifactId>36                 <version>2.4</version>37                 <!-- The configuration of the plugin -->38                 <configuration>39                     <!-- Specifies the configuration file of the assembly plugin -->40                     <descriptors>41                         <descriptor>${project.basedir}/src/main/assembly/assembly.xml</descriptor>42                     </descriptors>43                 </configuration>44                 <executions>45                     <execution>46                         <id>make-assembly</id>47                         <phase>package</phase>48                         <goals>49                             <goal>single</goal>50                         </goals>51                     </execution>52                 </executions>53             </plugin></code>

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

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

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

代码语言:javascript代码运行次数:0运行复制
<code class="javascript"> 1 <assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2           xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd 3 http://maven.apache.org/ASSEMBLY/2.0.0 "> 4     <id>${activeProfile}</id> 5     <!--打包成一个用于发布的zip文件--> 6     <formats> 7         <format>zip</format> 8     </formats> 9     <!--true:zip中生成一级目录(此处屏蔽,配合脚本需要profiles后缀)-->10     <includeBaseDirectory>false</includeBaseDirectory>11     <dependencySets>12         <dependencySet>13             <!--打包进zip文件的lib目录-->14             <useProjectArtifact>false</useProjectArtifact>15             <outputDirectory>${package-name}-${activeProfile}/lib</outputDirectory>16             <unpack>false</unpack>17         </dependencySet>18     </dependencySets>1920     <fileSets>21         <!-- 配置文件打包进zip文件的conf目录 -->22         <fileSet>23             <directory>${project.basedir}/src/main/profiles/${activeProfile}</directory>24             <outputDirectory>${package-name}-${activeProfile}/conf</outputDirectory>25             <includes>26                 <include>**/*</include>27                 <!--<include>*.xml</include>-->28                 <!--<include>*.properties</include>-->29                 <!--<include>*.yml</include>-->30             </includes>31         </fileSet>3233         <!--启动脚本打包进zip文件-->34         <fileSet>35             <directory>${project.basedir}/src/main/scripts</directory>36             <outputDirectory></outputDirectory>37             <includes>38                 <include>**/*</include>39             </includes>40             <!-- 文件文件权限为777 -->41             <fileMode>777</fileMode>42             <!-- 目录权限为777  -->43             <directoryMode>777</directoryMode>44             <!--脚本中参数变量为pom中的值 关键-->45             <filtered>true</filtered>46         </fileSet>4748         <!-- 项目编译出来的jar打包进zip文件 -->49         <fileSet>50             <directory>${project.build.directory}</directory>51             <outputDirectory>${package-name}-${activeProfile}/</outputDirectory>52             <includes>53                 <include>*.jar</include>54             </includes>55         </fileSet>56     </fileSets>57 </assembly></code>

重点节点介绍:

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脚本,该脚本具有的功能如:

皮卡智能
皮卡智能

AI驱动高效视觉设计平台

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

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

java -cpjava -jar

如图命令格式:

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

来看全部的shell代码:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">  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</code>

正如上面小节说的,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运行复制
<code class="javascript">1 unzip -od eureka-server-0.0.1-node eureka-server-0.0.1-node.zip</code>

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

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

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

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">1 vim shenniu_publish.sh2 set ff=unix3 :wq</code>

执行完后,再来运行脚本./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运行复制
<code class="javascript">文章有帮助的话,在看,转发吧。谢谢支持哟 (*^__^*)</code>

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

156

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

88

2026.01.26

rabbitmq和kafka有什么区别
rabbitmq和kafka有什么区别

rabbitmq和kafka的区别:1、语言与平台;2、消息传递模型;3、可靠性;4、性能与吞吐量;5、集群与负载均衡;6、消费模型;7、用途与场景;8、社区与生态系统;9、监控与管理;10、其他特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

207

2024.02.23

Java 消息队列与异步架构实战
Java 消息队列与异步架构实战

本专题系统讲解 Java 在消息队列与异步系统架构中的核心应用,涵盖消息队列基本原理、Kafka 与 RabbitMQ 的使用场景对比、生产者与消费者模型、消息可靠性与顺序性保障、重复消费与幂等处理,以及在高并发系统中的异步解耦设计。通过实战案例,帮助学习者掌握 使用 Java 构建高吞吐、高可靠异步消息系统的完整思路。

48

2026.01.28

spring boot框架优点
spring boot框架优点

spring boot框架的优点有简化配置、快速开发、内嵌服务器、微服务支持、自动化测试和生态系统支持。本专题为大家提供spring boot相关的文章、下载、课程内容,供大家免费下载体验。

139

2023.09.05

spring框架有哪些
spring框架有哪些

spring框架有Spring Core、Spring MVC、Spring Data、Spring Security、Spring AOP和Spring Boot。详细介绍:1、Spring Core,通过将对象的创建和依赖关系的管理交给容器来实现,从而降低了组件之间的耦合度;2、Spring MVC,提供基于模型-视图-控制器的架构,用于开发灵活和可扩展的Web应用程序等。

408

2023.10.12

Java Spring Boot开发
Java Spring Boot开发

本专题围绕 Java 主流开发框架 Spring Boot 展开,系统讲解依赖注入、配置管理、数据访问、RESTful API、微服务架构与安全认证等核心知识,并通过电商平台、博客系统与企业管理系统等项目实战,帮助学员掌握使用 Spring Boot 快速开发高效、稳定的企业级应用。

73

2025.08.19

Java Spring Boot 4更新教程_Java Spring Boot 4有哪些新特性
Java Spring Boot 4更新教程_Java Spring Boot 4有哪些新特性

Spring Boot 是一个基于 Spring 框架的 Java 开发框架,它通过 约定优于配置的原则,大幅简化了 Spring 应用的初始搭建、配置和开发过程,让开发者可以快速构建独立的、生产级别的 Spring 应用,无需繁琐的样板配置,通常集成嵌入式服务器(如 Tomcat),提供“开箱即用”的体验,是构建微服务和 Web 应用的流行工具。

147

2025.12.22

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

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

精品课程

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

共48课时 | 10.5万人学习

Git 教程
Git 教程

共21课时 | 4.1万人学习

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

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