SpringBoot 增量部署发布(第2版)

news2025/1/16 1:47:10

一、背景介绍

书接上一篇《SpringBoot 增量部署发布_springboot增量部署-CSDN博客》,上一篇内容实现了将静态资源与jar分离,但是即使是打包成**-exec.jar,解压jar文件,可以看到里面包含了static,resource目录,整个jar文件还是偏大,有没有办法彻底分离静态资源和jar呢,这篇文章就是解决这个问题的。

二、解决办法

还是修改项目pom.xml文件的build节点。

1.打包完整包

这跟springboot默认的打包方式一致,将整个程序打包成一个jar,可以根据实际情况看是否使用,有,可以不用。

<!--0.完整包:这个是springboot的默认编译插件,他默认会把所有的文件打包成一个jar-->
<plugin>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-maven-plugin</artifactId>
	<executions>
		<execution>
			<goals>
				<goal>repackage</goal>
			</goals>
		</execution>
	</executions>
	<configuration>
		<!--程序入口类 -->
		<mainClass>com.rc114.web.BlogApplication</mainClass>
		<addResources>true</addResources>
		<outputDirectory>${project.build.directory}/jar-one-package</outputDirectory>
	</configuration>
</plugin>

2.打包jar,生成项目对应的jar

此步是将web项目打包成jar,但是不包含static,templates目录。

<!--分离包:步骤1.打包jar,生成项目对应的jar,如:rc_web_rb-0.0.1.jar -->
<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-jar-plugin</artifactId>
	<configuration>
		<!-- 不打包资源文件(配置文件和依赖包分开) -->
		<excludes>
			<exclude>*.yml</exclude>
			<exclude>*.properties</exclude>
			<exclude>mybatis/**</exclude>
			<exclude>mapper/**</exclude>
			<exclude>static/**</exclude>
			<exclude>templates/**</exclude>
		</excludes>
		<archive>
			<manifest>
				<addClasspath>true</addClasspath>
				<!-- MANIFEST.MF 中 Class-Path 加入前缀 -->
				<classpathPrefix>lib/</classpathPrefix>
				<!-- jar包不包含唯一版本标识 -->
				<useUniqueVersions>false</useUniqueVersions>
				<!--程序入口类 -->
				<mainClass>com.rc114.web.BlogApplication</mainClass>
			</manifest>
			<manifestEntries>
				<!--MANIFEST.MF 中 Class-Path 加入资源文件目录 -->
				<Class-Path>./resources/</Class-Path>
			</manifestEntries>
		</archive>
		<outputDirectory>${project.build.directory}</outputDirectory>
	</configuration>
</plugin>

注意:

1.mainClass 需要根据你实际情况进行修改。

2.excludes 排除了不必要的文件夹,所以打包出来的jar会比较小。

3.打包lib,将引用jar放到lib文件夹

<!--分离包:步骤2:打包lib:该插件的作用是用于复制依赖的jar包到指定的文件夹里 -->
<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-dependency-plugin</artifactId>
	<executions>
		<execution>
			<id>copy-dependencies</id>
			<phase>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>

4.打包resource,将resources目录复制到target目录

<!--分离包:步骤3.复制文件:该插件的作用是用于复制指定的文件(将resources目录复制到target目录) -->
<plugin>
	<artifactId>maven-resources-plugin</artifactId>
	<executions>
		<execution>
			<!-- 复制配置文件 -->
			<id>copy-resources</id>
			<phase>package</phase>
			<goals>
				<goal>copy-resources</goal>
			</goals>
			<configuration>
				<resources>
					<resource>
						<directory>src/main/resources</directory>
						<includes>
							<include>*.yml</include>
							<include>*.properties</include>
							<include>mybatis/**</include>
							<include>logback/**</include>
							<include>mapper/**</include>
							<include>static/**</include>
							<include>templates/**</include>
						</includes>
					</resource>
				</resources>
				<outputDirectory>${project.build.directory}/resources</outputDirectory>
			</configuration>
		</execution>
	</executions>
</plugin>

5.清理非必要目录

在target目录下,还会生成classes,generated-sources,maven-archiver,maven-status等目录,这些目录在真正部署时,往往是不需要的,可以在打包完成后排除掉。通过maven-antrun-plugin插件即可排除指定的目录。

<!--打包完成后,移除非必要目录(根据实际情况进行配置)-->
<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-antrun-plugin</artifactId>
	<version>3.0.0</version>
	<executions>
		<execution>
			<phase>package</phase>
			<goals>
				<goal>run</goal>
			</goals>
			<configuration>
				<target>
					<delete dir="${project.build.directory}/antrun" />
					<delete dir="${project.build.directory}/classes" />
					<delete dir="${project.build.directory}/generated-sources" />
					<delete dir="${project.build.directory}/maven-archiver" />
					<delete dir="${project.build.directory}/maven-status" />
				</target>
			</configuration>
		</execution>
	</executions>
</plugin>

三、完整的配置

<build>
	<plugins>
		<!--0.完整包:这个是springboot的默认编译插件,他默认会把所有的文件打包成一个jar-->
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<executions>
				<execution>
					<goals>
						<goal>repackage</goal>
					</goals>
				</execution>
			</executions>
			<configuration>
				<!--程序入口类 -->
				<mainClass>com.rc114.web.BlogApplication</mainClass>
				<addResources>true</addResources>
				<outputDirectory>${project.build.directory}/jar-one-package</outputDirectory>
			</configuration>
		</plugin>
		<!--分离包:步骤1.打包jar,生成项目对应的jar,如:rc_web_rb-0.0.1.jar -->
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-jar-plugin</artifactId>
			<configuration>
				<!-- 不打包资源文件(配置文件和依赖包分开) -->
				<excludes>
					<exclude>*.yml</exclude>
					<exclude>*.properties</exclude>
					<exclude>mybatis/**</exclude>
					<exclude>mapper/**</exclude>
					<exclude>static/**</exclude>
					<exclude>templates/**</exclude>
				</excludes>
				<archive>
					<manifest>
						<addClasspath>true</addClasspath>
						<!-- MANIFEST.MF 中 Class-Path 加入前缀 -->
						<classpathPrefix>lib/</classpathPrefix>
						<!-- jar包不包含唯一版本标识 -->
						<useUniqueVersions>false</useUniqueVersions>
						<!--程序入口类 -->
						<mainClass>com.rc114.web.BlogApplication</mainClass>
					</manifest>
					<manifestEntries>
						<!--MANIFEST.MF 中 Class-Path 加入资源文件目录 -->
						<Class-Path>./resources/</Class-Path>
					</manifestEntries>
				</archive>
				<outputDirectory>${project.build.directory}</outputDirectory>
			</configuration>
		</plugin>

		<!--分离包:步骤2:打包lib:该插件的作用是用于复制依赖的jar包到指定的文件夹里 -->
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-dependency-plugin</artifactId>
			<executions>
				<execution>
					<id>copy-dependencies</id>
					<phase>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>

		<!--分离包:步骤3.复制文件:该插件的作用是用于复制指定的文件(将resources目录复制到target目录) -->
		<plugin>
			<artifactId>maven-resources-plugin</artifactId>
			<executions>
				<execution>
					<!-- 复制配置文件 -->
					<id>copy-resources</id>
					<phase>package</phase>
					<goals>
						<goal>copy-resources</goal>
					</goals>
					<configuration>
						<resources>
							<resource>
								<directory>src/main/resources</directory>
								<includes>
									<include>*.yml</include>
									<include>*.properties</include>
									<include>mybatis/**</include>
									<include>logback/**</include>
									<include>mapper/**</include>
									<include>static/**</include>
									<include>templates/**</include>
								</includes>
							</resource>
						</resources>
						<outputDirectory>${project.build.directory}/resources</outputDirectory>
					</configuration>
				</execution>
			</executions>
		</plugin>
	</plugins>
</build>

最终打包输出的target目录结构:

lib和***.jar 供后端更换,发布新程序。

resource 供前端更换,发布新程序。

这样就可以增量更新了,每次只用传很小的文件上去就可以了。

启动程序跟原来一样,直接把文件放在同级目录,然后运行 java -jar  rc_web_blog-0.0.1.jar 即可。

四、参考文档

SpringBoot打包实现静态文件、配置文件、jar包分离

https://www.cnblogs.com/pxblog/p/14645043.html

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

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

相关文章

单片机智能家居火灾环境安全检测-分享

目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 电路图采用Altium Designer进行设计&#xff1a; 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 传统的火灾报警系统大多依赖于简单的烟雾探测器或温度传感器&#xff0c;…

C++:指针和引用

指针的基础 数据在内存当中是怎么样被存储的 数据在内存中的存储方式取决于数据的类型和计算机的体系结构 基本数据类型 整数类型&#xff1a;整数在内存中以二进制补码的形式存储。对于有符号整数&#xff0c;最高位为符号位&#xff0c;0 表示正数&#xff0c;1 表示负数。…

MySQL更换瀚高语法更换

MySQL更换瀚高语法更换 一、前言二、语句 一、前言 水一篇,mysql更换瀚高之后&#xff0c;一些需要更换的语法介绍 > 二、语句 MySQL瀚高MySQL用法瀚高用法说明ifnull(x,y)coalesce(x,y)相同相同用于检查两个表达式并返回第一个非空表达式。如果第一个表达式不是 NULL&…

亚马逊云服务器(AWS):功能、优势与使用指南

亚马逊云服务器&#xff08;AWS&#xff09;概述 亚马逊云服务器&#xff08;Amazon Web Services&#xff0c;简称AWS&#xff09;是全球领先的云计算平台&#xff0c;提供一系列强大且灵活的云服务&#xff0c;帮助企业和开发者通过云基础设施实现数据存储、计算、分析和机器…

国产三维CAD 2025新动向:推进MBD模式,联通企业设计-制造数据

本文为CAD芯智库原创整理&#xff0c;未经允许请勿复制、转载&#xff01; 上一篇文章阿芯分享了影响企业数字化转型的「MBD」是什么、对企业优化产品设计流程有何价值——这也是国产三维CAD软件中望3D 2024发布会上&#xff0c;胡其登先生&#xff08;中望软件产品规划与GTM中…

小试牛刀-Anchor安装和基础测试

目录 一、编写目的 二、安装步骤 2.1 安装Rust 设置rustup镜像 安装Rust 2.2 安装node.js 2.3 安装Solana-CLI 2.4 安装Anchor CLI 三、Program测试 四、可能出现的问题 Welcome to Code Blocks blog 本篇文章主要介绍了 [Anchor安装和基础测试] 博主广交技术好友&…

如何在 Ubuntu 上安装 Emby 媒体服务器

Emby 是一个开源的媒体服务器解决方案&#xff0c;它能让你整理、流媒体播放和分享你的个人媒体收藏&#xff0c;包括电影、音乐、电视节目和照片。Emby 帮你集中多媒体内容&#xff0c;让你无论在家还是在外都能轻松访问。它还支持转码&#xff0c;让你能够播放各种格式的内容…

php交友源码交友系统源码相亲交友系统源码php社交系统php婚恋源码php社区交友源码vue 仿交友社交语聊技术栈

关于PHP交友、相亲、婚恋、社区交友系统的源码以及Vue仿交友社交语聊技术栈&#xff0c;以下是一些详细信息和建议&#xff1a; 一、PHP交友系统源码 系统架构设计 前端展示层&#xff1a;负责向用户提供直观友好的界面&#xff0c;包括注册登录页面、个人资料页面、匹配页面、…

【装饰珠——分组背包】

题目 代码 #include <bits/stdc.h> using namespace std; const int N 1e410; int cnt[5]; // 存兼容i等级及以下的孔的数目的桶 int l[N], p[N]; // l[i] i号珠子等级 p[i] i号珠子的上限 int w[N][8], f[N]; // w[i][j] i号珠子镶嵌j个的值 f[i] 孔数为i的最大值…

数据库审计工具--Yearning 3.1.9普民的使用指南

1 页面登录 登录地址:18000 &#xff08;不要勾选LDAP&#xff09; 2 修改用户密码 3 DML/DDL工单申请及审批 工单申请 根据需要选择【DML/DDL/查询】中的一种进行工单申请 填写工单信息提交SQL检测报错修改sql语句重新进行SQL检测&#xff0c;如检测失败可以进行SQL美化后…

Misc_01转二维码(不是二进制)

例题ctfhub/隐写v2.0 打开是一张图片 文件分离得到zip&#xff0c;爆破密码得到7878 打开得到0和1&#xff0c; !!!不是二进制转图片&#xff0c;直接是二维码 缩小能看到 000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000…

AI工具百宝箱|任意选择与Chatgpt、gemini、Claude等主流模型聊天的Anychat,等你来体验!

文章推荐 AI工具百宝箱&#xff5c;使用Deep Live Cam&#xff0c;上传一张照片就可以实现实时视频换脸...简直太逆天&#xff01; Anychat 这是一款可以与任何模型聊天 &#xff08;chatgpt、gemini、perplexity、claude、metal llama、grok 等&#xff09;的应用。 在页面…

[论文阅读] 异常检测综述 Deep Learning for Anomaly Detection: A Review(一)

深度学习在异常检测中的应用&#xff1a;综述 摘要 异常检测&#xff0c;又称离群点检测或新奇性检测&#xff0c;在各个研究领域中数十年来一直是一个持续且活跃的研究领域。仍然存在一些独特的问题复杂性和挑战&#xff0c;需要先进的方法来解决。近年来&#xff0c;基于深…

PaddlePaddle 开源产业级文档印章识别PaddleX-Pipeline “seal_recognition”模型 开箱即用篇(一)

AI时代到来&#xff0c;各行各业都在追求细分领域垂直类深度学习模型&#xff0c;今天给大家介绍一个PaddlePaddle旗下&#xff0c;基于PaddleX Pipeline 来完成印章识别的模型“seal_recognition”。 官方地址&#xff1a;https://github.com/PaddlePaddle/PaddleX/blob/relea…

Ubuntu 22.04 上快速搭建 Samba 文件共享服务器

Samba 简介 Samba 是一个开源软件&#xff0c;它扮演着不同操作系统间沟通的桥梁。通过实现 SMB&#xff08;Server Message Block&#xff09;协议&#xff0c;Samba 让文件和打印服务在 Windows、Linux 和 macOS 之间自由流动。 以下是 Samba 的特点&#xff1a; 跨平台兼…

语义分割(semantic segmentation)

语义分割(semantic segmentation) 文章目录 语义分割(semantic segmentation)图像分割和实例分割代码实现 语义分割指将图片中的每个像素分类到对应的类别&#xff0c;语义区域的标注和预测是 像素级的&#xff0c;语义分割标注的像素级的边界框显然更加精细。应用&#xff1a…

QT基础 UI编辑器 QT5.12.3环境 C++环境

一、UI编辑器 注意&#xff1a;创建工程时&#xff0c;要勾上界面按钮 UI设计师界面的模块 UI编辑器会在项目构建目录中自动生成一个ui_xxx.h&#xff08;构建一次才能生成代码&#xff09;&#xff0c;来表示ui编辑器界面的代码&#xff0c;属于自动生成的&#xff0c;一定不…

Jmeter的后置处理器(二)

5--JSR223 PostProcessor 功能特点 自定义后处理逻辑&#xff1a;使用脚本语言编写自定义的后处理逻辑。支持多种脚本语言&#xff1a;支持 Groovy、JavaScript、BeanShell 等脚本语言。动态参数传递&#xff1a;将提取的数据存储为变量&#xff0c;供后续请求使用。灵活性高…

高阶C语言之五:(数据)文件

目录 文件名 文件类型 文件指针 文件的打开和关闭 文件打开模式 文件操作函数&#xff08;顺序&#xff09; 0、“流” 1、字符输出函数fputc 2、字符输入函数fgetc 3、字符串输出函数fputs 4、 字符串输入函数fgets 5、格式化输入函数fscanf 6、格式化输出函数fpr…

【Android、IOS、Flutter、鸿蒙、ReactNative 】实现 MVP 架构

Android Studio 版本 Android Java MVP 模式 参考 模型层 model public class User {private String email;private String password;public User(String email, String password) {this.email = email;this.password = password;}public String getEmail() {return email;}…