当前位置: 首页 > 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…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...

TCP/IP 网络编程 | 服务端 客户端的封装

设计模式 文章目录 设计模式一、socket.h 接口&#xff08;interface&#xff09;二、socket.cpp 实现&#xff08;implementation&#xff09;三、server.cpp 使用封装&#xff08;main 函数&#xff09;四、client.cpp 使用封装&#xff08;main 函数&#xff09;五、退出方法…...

路由基础-路由表

本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中&#xff0c;往往存在多个不同的IP网段&#xff0c;数据在不同的IP网段之间交互是需要借助三层设备的&#xff0c;这些设备具备路由能力&#xff0c;能够实现数据的跨网段转发。 路由是数据通信网络中最基…...

RKNN开发环境搭建2-RKNN Model Zoo 环境搭建

目录 1.简介2.环境搭建2.1 启动 docker 环境2.2 安装依赖工具2.3 下载 RKNN Model Zoo2.4 RKNN模型转化2.5编译C++1.简介 RKNN Model Zoo基于 RKNPU SDK 工具链开发, 提供了目前主流算法的部署例程. 例程包含导出RKNN模型, 使用 Python API, CAPI 推理 RKNN 模型的流程.   本…...