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

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

MySQL 知识小结(一)

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

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...