SpringBoot 增量部署发布
一、背景介绍
由于项目依赖的jar越来越多,Springboot默认的打包方式是将整个项目打包成一个jar包,每次发布时,打包后的jar越来越大,更新一个很小的功能,需要将整个jar上传运行。这样效率太低了,考虑实现每次发布时,只发布修改了的部分,实现增量发布。
二、实现思路
1.将整体打包的jar进行拆分:
拆为引用的lib和resource(静态资源)两部分(准确说是三部分,还包括当前项目的jar)
2.通过命令:java -Dloader.path=./lib,./resource -jar demo-exec.jar 来指定资源路径运行。
三、实现步骤
1.打包当前web项目
打包当前web项目时,排除引用的jar,只打包成可运行的jar。
修改项目pom.xml文件,在build->plugins里增加:
<!--1.打包当前web项目-->
<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><!-- 指定该jar包启动时的主类--><mainClass>com.rc114.bms.RbApplication</mainClass><!-- 模块打包需要增加这个配置,带exec的为可执行jar,不带的为可引用jar--><classifier>exec</classifier><includeSystemScope>true</includeSystemScope><!--必须为ZIP模式,不指定的话-Dloader.path不生效--><layout>ZIP</layout><!-- 打包的时候排除的jar包--><includes><include><groupId>non-exists</groupId><artifactId>non-exists</artifactId></include></includes></configuration>
</plugin>
注意:这里使用的是 spring-boot-maven-plugin 插件。
2.打包依赖项lib
修改项目pom.xml文件,在build->plugins里增加:
<!--2.打包依赖项-->
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><version>3.2.0</version> <!-- 使用适合你的版本 --><executions><execution><id>copy-dependencies</id><phase>prepare-package</phase><goals><goal>copy-dependencies</goal></goals><configuration><outputDirectory>${project.build.directory}/lib</outputDirectory><overWriteReleases>false</overWriteReleases><overWriteSnapshots>false</overWriteSnapshots><overWriteIfNewer>true</overWriteIfNewer></configuration></execution></executions>
</plugin>
注意:这里使用的是 maven-dependency-plugin 插件。
完整的 build 配置:
<build><plugins><!--1.打包当前web项目--><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><!-- 指定该jar包启动时的主类--><mainClass>com.rc114.bms.RbApplication</mainClass><!-- 模块打包需要增加这个配置,带exec的为可执行jar,不带的为可引用jar--><classifier>exec</classifier><includeSystemScope>true</includeSystemScope><!--必须为ZIP模式,不指定的话-Dloader.path不生效--><layout>ZIP</layout><!-- 打包的时候排除的jar包--><includes><include><groupId>non-exists</groupId><artifactId>non-exists</artifactId></include></includes></configuration></plugin><!--2.打包依赖项--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><version>3.2.0</version> <!-- 使用适合你的版本 --><executions><execution><id>copy-dependencies</id><phase>prepare-package</phase><goals><goal>copy-dependencies</goal></goals><configuration><outputDirectory>${project.build.directory}/lib</outputDirectory><overWriteReleases>false</overWriteReleases><overWriteSnapshots>false</overWriteSnapshots><overWriteIfNewer>true</overWriteIfNewer></configuration></execution></executions></plugin></plugins>
</build>
执行maven打包命令,打包完后,将得到这样的结果:
3.复制resource文件夹
直接复制项目里的src\main\resources文件夹到准备发布目录即可。
4.上传更新文件
将上面的lib目录和***-exec.jar和网站项目下src\main\resources目录复制到一起,大概像这样:
将上面目录上传到服务器,然后执行命令:
java -Dloader.path=./lib,./resource -jar rc_web_rb-0.0.1-exec.jar
即可运行Springboot项目。
四、增量发布的好处
进行增量打包后:
1.如果前端有修改时,可以对resource中的文件进行替换,且不用重启服务。
2.如果后端有修改,要看是web项目修改还是引用的jar修改:
(1)如果是web项目有修改,只用更新项目****-exec.jar即可(需重新执行启动命令)。
(2)如果是引用的jar包有修改,只需将变动的jar包上传至lib文件夹即可。
附:Springboot启动脚本
#!/bin/sh
#路径
APP_LIB=/***/lib
APP_RESOURCE=/***/resources
APP_NAME=/***/rc_web_rb-0.0.1-exec.jar
APP_LOG=/***/rc_web_rb-0.0.1.log# 查询是否有原进程
tpid1=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
# 如果此进程已经启动,则先杀掉
if [ $tpid1 ]; then
kill -9 $tpid1
fi# 启动项目jar包,java命令写成了绝对路径,因为系统启动的时候是不识别环境变量的
# 日志文件也写成了绝对路径,不然日志会输出在init.d目录
nohup /usr/lib/jvm/jdk-17.0.2/bin/java -Dloader.path=$APP_LIB,$APP_RESOURCE -Dspring.profiles.active=pro -jar $APP_NAME -> $APP_LOG 2>&1 &
修改对应参数,将脚本保存为start.sh,切换到脚本所在目录,执行:./start.sh 即可启动项目。
相关文章:

SpringBoot 增量部署发布
一、背景介绍 由于项目依赖的jar越来越多,Springboot默认的打包方式是将整个项目打包成一个jar包,每次发布时,打包后的jar越来越大,更新一个很小的功能,需要将整个jar上传运行。这样效率太低了,考虑实现每…...
java八股!1
集合 目录 集合java中存在哪些集合?底层实现逻辑?哪些集合是线程安全的?集合的对比:hash冲突如何解决hashmap为什么线程不安全,如何实现安全?hashmap中循环链表的产生hashmap底层实现原理和扩容机制map的遍…...

【学术会议征稿】2024年智能驾驶与智慧交通国际学术会议(IDST 2024)
2024年智能驾驶与智慧交通国际学术会议(IDST 2024) 2024 International Conference on Intelligent Driving and Smart Transportation 智能驾驶和智慧交通利用新兴技术,使城市出行更加方便、更具成本效益且更安全。在此背景下,由中南大学主办的2024年…...

2024最全网络安全工程师面试题(附答案)
🤟 基于入门网络安全/黑客打造的:👉黑客&网络安全入门&进阶学习资源包 2024年过去了一大半,先来灵魂三连问,年初定的目标完成多少了?薪资涨了吗?女朋友找到了吗? 一、网络…...
828华为云征文| 华为云 Flexus X 实例:引领云计算新时代的柔性算力先锋
828华为云征文| 华为云 Flexus X 实例:引领云计算新时代的柔性算力先锋 1. 推出背景 在数字经济快速发展的当下,数字化转型已成为企业发展的必然趋势。然而,中小企业在数字化转型过程中面临着诸多困境。据《2024 年中小企业数字化转型白皮书…...

何时何地,你需要提示工程、函数调用、RAG还是微调大模型?
介绍 在快速发展的生成式人工智能领域,某些流行术语已变得司空见惯:“提示工程”、“函数调用”、“RAG”和“微调”,你应该也经常遇到这些术语,但你是否能够理清这些概念之间的关系?这些其实都是一些大模型的应用策略…...

three.js线框模式
背景 设计师希望弄一个模型的这个效果: 但是,我使用three.js提供的EdgesGeometry死活只能做到下面这种: 后来才知道three.js只支持画三角面,四边形面并不支持,这是由更底层的webGL决定的。 但是在查找资料的过程中&…...

VScode 的简单使用
目录 1. VScode 的使用 1.1 常用插件 1.2 常用快捷键 1. VScode 的使用 1.1 常用插件 1.2 常用快捷键 也可以“ CTRLD ”;使用“CTRL滚轮”即可; ctrl /-,是用来展开/收起代码的; 比如:js 的多行注释是 shiftalt…...

五星级可视化页面(07):城市交通方向,城市畅通的保障。
城市交通方面的可视化大屏,一方面用户可以通过五星级可视化页面快速了解城市交通方向,实时掌握交通状况,选择最佳出行方案,提高出行效率,另一方面也有助于城市交通管理部门进行交通流量调度和管理。 本期发布一些经典…...

贪心+构造,1924A - Did We Get Everything Covered?
目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1924A - Did We Get Everything Covered? 二、解题报告 1、思路分析 我…...

麦汁煮沸工艺
麦汁煮沸是啤酒酿造中至关重要的工艺环节之一,直接影响啤酒的风味。今天,天泰邀您一起深入探讨这一关键的酿造技术。 煮沸麦汁 在煮沸麦汁时,时间和温度控制至关重要。通常,麦汁煮沸持续 40 到 50 分钟,具体时间取决于…...

企业级WEB应用服务器---TOMACT
一、WEB技术介绍 1.1 Http和B/S结构 操作系统一般都有子进程系统,使用多进程就可以充分利用硬件资源,提高效率。在前面的学习中我们了解到进程中可以有多个线程,且每一个线程都可以被CPU调度执行,这样就可以让程序并行执行。一台…...

前端:JavaScript中的this
前端:JavaScript中的this 1. this的指向2. 指定this的值3. 手写call方法4. 手写apply方法5. 手写bind方法 1. this的指向 在非严格模式下,总是指向一个对象;在严格模式下可以是任意值。 开启严格模式,如果是为整个脚本开启&#…...

Zynq7020 SDK 初学篇(5)- 中断
1.开发背景 基于上一个篇章 GPIO 使用,引入中断的使用。 2.开发需求 PS 和 PL 按键输入中断,并输出对应的日志打印 3.开发环境 Zynq7020 Vivado2017.4 4.实现步骤 4.1 设计配置 PL Key0 56 PS key0 12 PS key1 11 4.2 代码编写 GPIO 配置 #if…...

如何清缓存
谷歌浏览器: ctrlshiftR 360安全浏览器如下图 1、点击右上角三横杠-点击“设置” 2、进入设置后-点击“安全设置”-点击“清理上网痕迹设置” 3、时间范围选全部-只勾选浏览器缓存的临时文件,其他的别勾选 4、点击“立即清除”...

《计算机算法设计与分析》笔记
第一章 算法概述 1.1算法性质: 输入、输出、确定性、有限性 1.2时间复杂度 上界记号O:如果存在正的常数C和自然数N0,使得当N≧N0时有f(N)≦Cg(N),则f(N)有上界函数g(N),记为f(N) O(g(N))。 同阶记号θ:…...

智能指针怎么就智能了?
在C中,内存泄漏是一个不太容易发现但又有一定影响的问题,而且在引入了异常的机制之后,代码的走向就更加不可控,更容易发生内存泄露。【补充:内存泄露(Memory Leak)指的是在程序运行期间…...

mysql 限制用户登录次数超过3次就 锁定账户在一段时间内不运行操作
这里是引用 主要实现步骤: 1.目测安装的mysql版本得是5.7.40往上,因为我的版本是5.7.14发现里面没有控制等下限制这个插件,插件具体的查看是在你安装目录下的lib/pugin下面 比如我的:C:\zz\ProgramFiles\MySQL\MySQL Server 5.7\l…...
深度学习中的常用线性代数知识汇总——第二篇:行列式、逆矩阵、特征值与特征向量
文章目录 0. 前言1. 行列式1.1 行列式的定义1.2 行列式的计算方法1.3 行列式的性质1.4 行列式在深度学习中的应用 2. 逆矩阵2.1 逆矩阵的定义2.2 逆矩阵的计算方法2.3 逆矩阵的性质2.4 逆矩阵在深度学习中的应用 3. 特征值与特征向量3.1 特征值与特征向量的定义3.2 特征值和特征…...

《MaPLe: Multi-modal Prompt Learning》中文校对版
系列论文研读目录 文章目录 系列论文研读目录题目:《Maple:多模态提示学习》摘要1.简介2.相关工作视觉语言模型:提示学习:视觉语言模型中的提示学习: 3.方法3.1.回看CLIP编码图像:编码文本:Zero…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...