当前位置: 首页 > news >正文

SpringBoot 增量部署发布

一、背景介绍

由于项目依赖的jar越来越多,Springboot默认的打包方式是将整个项目打包成一个jar包,每次发布时,打包后的jar越来越大,更新一个很小的功能,需要将整个jar上传运行。这样效率太低了,考虑实现每次发布时,只发布修改了的部分,实现增量发布。

二、实现思路

1.将整体打包的jar进行拆分:

   拆为引用的libresource(静态资源)两部分(准确说是三部分,还包括当前项目的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越来越多&#xff0c;Springboot默认的打包方式是将整个项目打包成一个jar包&#xff0c;每次发布时&#xff0c;打包后的jar越来越大&#xff0c;更新一个很小的功能&#xff0c;需要将整个jar上传运行。这样效率太低了&#xff0c;考虑实现每…...

java八股!1

集合 目录 集合java中存在哪些集合&#xff1f;底层实现逻辑&#xff1f;哪些集合是线程安全的&#xff1f;集合的对比&#xff1a;hash冲突如何解决hashmap为什么线程不安全&#xff0c;如何实现安全&#xff1f;hashmap中循环链表的产生hashmap底层实现原理和扩容机制map的遍…...

【学术会议征稿】2024年智能驾驶与智慧交通国际学术会议(IDST 2024)

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

2024最全网络安全工程师面试题(附答案)

&#x1f91f; 基于入门网络安全/黑客打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 2024年过去了一大半&#xff0c;先来灵魂三连问&#xff0c;年初定的目标完成多少了&#xff1f;薪资涨了吗&#xff1f;女朋友找到了吗&#xff1f; 一、网络…...

828华为云征文| 华为云 Flexus X 实例:引领云计算新时代的柔性算力先锋

828华为云征文| 华为云 Flexus X 实例&#xff1a;引领云计算新时代的柔性算力先锋 1. 推出背景 在数字经济快速发展的当下&#xff0c;数字化转型已成为企业发展的必然趋势。然而&#xff0c;中小企业在数字化转型过程中面临着诸多困境。据《2024 年中小企业数字化转型白皮书…...

何时何地,你需要提示工程、函数调用、RAG还是微调大模型?

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

three.js线框模式

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

VScode 的简单使用

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

五星级可视化页面(07):城市交通方向,城市畅通的保障。

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

贪心+构造,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、思路分析 我…...

麦汁煮沸工艺

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

企业级WEB应用服务器---TOMACT

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

前端:JavaScript中的this

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

Zynq7020 SDK 初学篇(5)- 中断

1.开发背景 基于上一个篇章 GPIO 使用&#xff0c;引入中断的使用。 2.开发需求 PS 和 PL 按键输入中断&#xff0c;并输出对应的日志打印 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、时间范围选全部-只勾选浏览器缓存的临时文件&#xff0c;其他的别勾选 4、点击“立即清除”...

《计算机算法设计与分析》笔记

第一章 算法概述 1.1算法性质&#xff1a; 输入、输出、确定性、有限性 1.2时间复杂度 上界记号O&#xff1a;如果存在正的常数C和自然数N0&#xff0c;使得当N≧N0时有f(N)≦Cg(N)&#xff0c;则f(N)有上界函数g(N)&#xff0c;记为f(N) O(g(N))。 同阶记号θ&#xff1a;…...

智能指针怎么就智能了?

在C中&#xff0c;内存泄漏是一个不太容易发现但又有一定影响的问题&#xff0c;而且在引入了异常的机制之后&#xff0c;代码的走向就更加不可控&#xff0c;更容易发生内存泄露。【补充&#xff1a;内存泄露&#xff08;Memory Leak&#xff09;指的是在程序运行期间&#xf…...

mysql 限制用户登录次数超过3次就 锁定账户在一段时间内不运行操作

这里是引用 主要实现步骤&#xff1a; 1.目测安装的mysql版本得是5.7.40往上&#xff0c;因为我的版本是5.7.14发现里面没有控制等下限制这个插件&#xff0c;插件具体的查看是在你安装目录下的lib/pugin下面 比如我的&#xff1a;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》中文校对版

系列论文研读目录 文章目录 系列论文研读目录题目&#xff1a;《Maple&#xff1a;多模态提示学习》摘要1.简介2.相关工作视觉语言模型&#xff1a;提示学习&#xff1a;视觉语言模型中的提示学习&#xff1a; 3.方法3.1.回看CLIP编码图像&#xff1a;编码文本&#xff1a;Zero…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...