SpringBoot 增量部署发布

news2024/11/16 7:35:39

一、背景介绍

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

二、实现思路

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

   拆为引用的libresource(静态资源)两部分(准确说是三部分,还包括当前项目的jar) 

2.通过命令:java -Dloader.path=./lib,./resource -jar demo-exec.jar 来指定资源路径运行。

三、实现步骤

1.打包当前web项目

修改项目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.上传更新文件

 将上面的lib目录和***-exec.jar和网站项目下src\main\resources目录复制到一起,大概像这样:

将上面目录上传到服务器,然后执行命令:

 java -Dloader.path=./lib,./resource -jar rc_web_rb-0.0.1-exec.jar

即可运行Springboot项目。

进行增量打包后:

如果前端有修改时,可以对resource中的文件进行替换,且不用重启服务。

如果后端有修改,要看是web项目修改还是引用的jar修改:

        如果是web项目有修改,只用更新rc_web_rb-0.0.1-exec.jar即可。

        如果是引用的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 即可启动项目。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2106767.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年百元蓝牙耳机推荐有哪些?四款年度热门机型评测推荐

随着蓝牙技术的不断成熟和普及&#xff0c;蓝牙耳机已经悄然成为我们日常生活中不可或缺的一部分&#xff0c;特别是在2024年&#xff0c;市面上涌现出了许多性价比极高的百元蓝牙耳机&#xff0c;那么在众多的蓝牙耳机里2024年百元蓝牙耳机推荐有哪些&#xff1f;为了解决大家…

【Java】实体类Javabean

文章目录 前言一、实体类Javabean是什么&#xff1f;二、代码总结 前言 记录实体类的基本语法 一、实体类Javabean是什么&#xff1f; 其实就是一种特殊形式的类&#xff0c;这种类特殊点在于&#xff1a; 1、这个类中的成员变量都要私有&#xff0c;并且要对外提供相应的ge…

【STM32+HAL库】---- 硬件IIC驱动0.96OLED

硬件开发板&#xff1a;STM32G0B1RET6 软件平台&#xff1a;cubemaxkeilVScode内容原著声明 代码借鉴学习于以下文章&#xff1a; STM32 使用硬件IIC驱动0.96寸4针IOLED显示器&#xff08;HAL库&#xff09; 1 新建cubemax工程 1.1 配置系统时钟RCC 1.2 配置引脚 1.3 导出工…

ICM20948 DMP代码详解(1)

序言 接触Invensense的芯片这已经是第三次了。2015年在第二空间的时候第一次接触它的芯片&#xff0c;那时候是MPU9250&#xff1b;2021年的时候在智橙动力再一次接触到了MPU6050&#xff0c;那个时候用到了其中的DMP&#xff1b;这次接触的是ICM20948&#xff0c;按目前笔者理…

吃多一时爽,吃少活更长!

美国索尔克生物研究所Belmonte研究团队和中科院研究团队在Cell上发表题为Caloric Restriction Reprograms the Single-Cell Transcriptional Landscape of Rattus Norvegicus Aging的研究内容&#xff0c;比较了摄入热量少30%的老鼠和正常饮食的老鼠之间的区别&#xff0c;发现…

黑马点评7——达人探店

文章目录 发布探店笔记查看探店笔记点赞功能点赞排行榜功能 发布探店笔记 这个其实比较简单&#xff0c;就是把笔记保存到数据库tb_blog中去 PostMappingpublic Result saveBlog(RequestBody Blog blog) {// 获取登录用户UserDTO user UserHolder.getUser();blog.setUserId(u…

python OpenCV的羽化融合图像

1. 读入两幅图像,苹果和橘子 2. 构建苹果和橘子的高斯金字塔&#xff08;6 层&#xff09; 3. 根据高斯金字塔计算拉普拉斯金字塔 4. 在拉普拉斯的每一层进行图像融合&#xff08;苹果的左边与橘子的右边融合&#xff09; 5. 根据融合后的图像金字塔重建原始图像。 impor…

YOLOv5改进 | 模块缝合 | C3 融合REPVGGOREPA提升检测性能【详细步骤 完整代码】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv5入门 改…

数字与文字组合商标,有一个元素近似整体驳回!

经常遇到有网友问驳回复审要不要做复审&#xff0c;其实判断分析好&#xff0c;大多数商标驳回后不值得做复审&#xff0c;也可以省掉不必要的费用&#xff0c;最近有个网友联系到普推知产商标老杨&#xff0c;咨询一个驳回复审的问题。 这个网友的商标是数字和文字组合&#…

若依系统的学习

若依环境 介绍 ‌若依是一款快速开发平台(低代码)&#xff0c;用于快速构建企业级后台管理系统&#xff0c;它提供了许多常用的功能模块和组件&#xff0c;包括权限管理、代码生成、工作流、消息中心等 官方地址: https://www.ruoyi.vip/ ‌基于Spring Boot和Spring Cloud‌…

【分享】Excel表格设置“打开密码”的两种方法

在工作中&#xff0c;Excel文件通常包含敏感数据&#xff0c;出于安全性考虑&#xff0c;给文件设置打开密码是非常有效的方式。接下来&#xff0c;小编给大家介绍两种方法&#xff0c;帮助你轻松为Excel文件设置密码。 方法一&#xff1a;在Excel表里设置“打开密码” 这是Ex…

2024AEI:Cross-Supervised multisource prototypical network

目录 研究动机 研究数据集 研究方法 研究动机 该论文是为了解决以轴承故障诊断为背景的多源域小样本域自适应问题而提出的。文中有提及到实际的工业生产中&#xff0c;存在多源域缺少足够的样本标签数据支撑一般的多源域域自适应&#xff08;MSDA&#xff09;方法的情况&…

借助el-steps和el-form实现超长规则配置的功能

目录 一、应用场景 二、开发流程 三、详细开发流程 四、总结 一、应用场景 最近开发了一个规则类的配置功能&#xff0c;这个功能之前就写过&#xff0c;最近完善了一下&#xff0c;所以将原先的规则变得更多元化&#xff0c;结构也更多了一层&#xff0c;添加新功能的时候…

Java箱与泛型

大O的渐进表示法 大 O 的渐进表示法 去掉了那些对结果影响不大的项 &#xff0c;简洁明了的表示出了执行次数。 void func1(int N){ int count 0; for (int i 0; i < N ; i) { for (int j 0; j < N ; j) { count; } } for (int k 0; k < 2 * N ; k) { count; } in…

深度学习示例2-多输入多输出的神经网络模型

一、代码示例 from tensorflow import keras from tensorflow.keras import layers import numpy as np# 定义 多输入 多输出的模型 vocabulary_size = 1000 num_tags = 100 num_departments = 4title = keras.Input(shape=(vocabulary_size,), name = "title") tex…

【虚拟化】KVM常用命令操作(virsh磁盘管理)

目录 一、KVM概述 1.1 KVM工具栈 1.2 libvirt架构概述 1.3 KVM磁盘格式介绍 1.4 KVM磁盘操作常见语法 1.5 qemu-img命令简介 1.6 libguestfs安装 二、虚拟机磁盘管理 2.1 查看虚拟机磁盘 2.2 创建虚拟机磁盘 2.3 扩容磁盘容量 2.4 查看虚拟机存储状态 2.5 快照 2…

基于BiLSTM-CRF的医学命名实体识别研究(下)模型构建

一.生成映射字典 接下来需要将每个汉字、边界、拼音、偏旁部首等映射成向量。所以&#xff0c;我们首先需要来构造字典&#xff0c;统计多少个不同的字、边界、拼音、偏旁部首等&#xff0c;然后再构建模型将不同的汉字、拼音等映射成不同的向量。 在prepare_data.py中自定义…

实现自定义的移动端双指缩放

原理&#xff1a; DOM上绑定双指触控相关的事件&#xff0c;当双指触控时&#xff0c;保存初始距离&#xff0c;当双指移动时&#xff0c;计算两触控点的距离&#xff0c;根据移动中的距离与初始距离调节缩放比例&#xff0c;再根据缩放比例改变元素样式即可实现缩放 效果演示…

Java,版本控制:算法详解与实现

Spring Boot微服务架构技术及其版本号比较优化 随着云技术和分布式系统的快速发展&#xff0c;微服务架构已经成为现代软件开发不可或缺的一部分。 Spring Boot&#xff0c;作为一款广受欢迎的Java开发框架&#xff0c;其简洁的配置和快速启动的特性深受开发者青睐。 配合Sp…

旅游线路规划和路线下载

新疆旅游&#xff0c;规划一个北疆旅游线路安排如下&#xff1a; 第一天&#xff1a;从乌鲁木齐到魔鬼城&#xff0c;晚上住宿克拉玛依市乌尔禾区&#xff1b; 第二天&#xff1a;从克拉玛依市乌尔木区到五彩滩&#xff0c;晚上住宿贾登峪&#xff1b; 第三天&#xff1a;从…