SpringBoot应用打成ZIP部署包

news2024/9/24 15:21:01

 背景

        平常开发SpringBoot应用,打包的时候一般都是按默认的打包方式把所有资源、源码和依赖统一打到一个jar包,这种打包方式方便快捷。最近开发项目遇到一个需求,需要把项目中的配置文件和/bin目录中的启停脚本打到SpringBoot应用jar之外,并把配置、启停脚本和应用jar包统一打成ZIP包;这样做的好处主要在于方便修改启停命令和相关配置文件。

 他山之石

        以往的项目,一般是按照打Spring应用包的方式把整个项目打到ZIP包中,打包后的ZIP包结构如下:

project
--bin
--config
--classes
--lib
--readme.txt

         对于把SpringBoot应用打包成ZIP的形式之前还没有处理过,在网上搜索之后,给出最详细打包方式的打包结果跟自己的预期还是不太一致。先看下大佬的打包逻辑—【maven打包】springboot打jar、zip包部署icon-default.png?t=N7T8https://blog.csdn.net/qq_41617261/article/details/121005871

按照大佬的打包方式,最终打包后的ZIP包中包含的目录有如下两种结果:

1.将源码打包到classes目录中的zip包结构:

Project目录
--bin
--classess
--config
--lib

2.将源码打成jar包的zip包结构:

Project目录
--bin
--config
--lib
--项目源码jar包

 我的打包方案

        我的具体需求

                 当前项目结构如下:

                

        在maven构建打包过程中,需要把logback.xml、run.sh中的一些占位符替换成pom文件中的属性值,并把项目源码、resource文件、依赖jar包仍按SpringBoot打包逻辑打到同一个SpringBoot应用jar包中,同时把bin/目录及resources/config目录内容复制到jar包外的同名目录(bin/和config/)中,最后把应用jar包、bin/、config/打到一个zip包中,最终zip解压后的构建包如下图所示:

        打包方案

        参考大佬的打包方式,结合自己的需求,修改打包配置及pom文件设置即可。根据大佬的打包方式及项目需求,需要用到的maven插件如下:

  • maven-resources-plugin——用于处理logback.xml文件中的参数替换(放在这个阶段处理主要是因为在本地调试时也需要用到logback.xml配置)
  • maven-compiler-plugin——编译项目
  • spring-boot-maven-plugin——打SpringBoot应用jar包
  • maven-assembly-plugin——替换脚本文件中的占位参数,并将项目文件按assembly设置打成zip包

 pom.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
...
<build>
		<finalName>${project.artifactId}-${project.version}</finalName>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-resources-plugin</artifactId>
				<version>3.2.0</version> <!-- 使用最新版本 -->
				<executions>
					<execution>
						<id>copy-resources</id>
						<phase>validate</phase>
						<goals>
							<goal>resources</goal>
						</goals>
						<configuration>
							<encoding>UTF-8</encoding>
							<resources>
								<resource>
									<directory>src/main/resources</directory>
									<filtering>true</filtering>
									<!-- 设置为true表示开启过滤 -->
									<includes>
										<include>logback.xml</include>
										<!-- 只对指定的文件启用过滤 -->
									</includes>
								</resource>
							</resources>
						</configuration>
					</execution>
				</executions>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.11.0</version>
				<configuration>
					<source>${java.version}</source>
					<target>${java.version}</target>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<version>2.7.8</version>
				<executions>
					<execution>
						<goals>
							<goal>repackage</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
			<plugin>
				<artifactId>maven-assembly-plugin</artifactId>
				<configuration>
					<descriptors>
						<descriptor>src/main/assembly/assembly.xml</descriptor>
					</descriptors>
				</configuration>
				<executions>
					<execution>
						<id>make-assembly</id>
						<phase>package</phase>
						<goals>
							<goal>single</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
....

</project>

assembly.xml配置:

<assembly
        xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
    <id>package</id>
    <formats>
        <format>zip</format>
    </formats>
    <includeBaseDirectory>true</includeBaseDirectory>
    <fileSets>
        <fileSet>
            <!-- filtered设成true在复制配置文件时,会先替换脚本中的占位符-->
            <filtered>true</filtered> 
            <directory>src/main/bin</directory>
            <outputDirectory>/bin</outputDirectory>
            <fileMode>777</fileMode>
        </fileSet>
        <fileSet>
            <directory>src/main/resources/config</directory>
            <outputDirectory>/config</outputDirectory>
        </fileSet>
        <!-- 把项目自己编译出来的jar文件,打包进zip文件的根目录 -->
        <fileSet>
            <directory>${project.build.directory}</directory>
            <outputDirectory></outputDirectory>
            <includes>
                <include>*.jar</include>
            </includes>
        </fileSet>
    </fileSets>
</assembly>

在idea中运行maven:clean->compile->package后,即可把项目打包成最后的部署zip包。

结语

        maven打包十分灵活,可以通过maven各个阶段的插件根据自身需求设置对应的配置内容,具体的需要深入研究maven生命周期处理方式和各插件的配置项的功能。

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

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

相关文章

Gland安装与Debug

下载地址&#xff1a;https://www.jetbrains.com.cn/go/download/#sectionwindows debug官方文档: https://www.jetbrains.com/help/go/debugging-code.html 创建项目 选择新建项目 填写项目本地路径&#xff0c;以及选择go SDK 项目创建后检查项目设置 添加main包以及…

新进程的加载与创建

1、实现fork系统调用 fork创建子进程。通过fork的返回值来判断是父进程还是子进程。 当fork()返回值会返回进程的id&#xff0c;当进程发现pid0&#xff0c;就知道了自己是fork出来的子进程&#xff1b;而如果pid > 0&#xff0c;则知道了自己是父进程。 fork系统调用实现…

【LoRa】CAD的工作原理以及使用

目录 1 CAD介绍1.1 CAD工作原理1.2 与CAD有关的中断 2 CAD的使用2.1 CAD总耗时2.2 CAD均衡配置2.3 最优配置速查表 3 CAD的应用3.1 CAD项目使用3.2 CAD扩展应用CSMA 4 参考文献 1 CAD介绍 本章介绍一下LoRa芯片的CAD功能、原理以及如何使用。由于第一代SX127x的CAD使用与以后的…

实测数据处理(RD算法处理)——SAR成像算法系列(十)

系列文章目录 《SAR学习笔记-SAR成像算法系列&#xff08;一&#xff09;》 《距离多普勒算法&#xff08;RDA&#xff09;-SAR成像算法系列&#xff08;三&#xff09;》 文章目录 一、算法流程 1.1、回波信号生成 1.2、 距离脉冲压缩 1.3、距离徙动校正 1.4、方位脉冲压缩 …

HDMI显示器驱动设计与验证

1 HDMI简介 在此附上HDMI协议的数据手册链接&#xff0c;更有1.4的中文版&#xff1a; https://pan.baidu.com/s/1CdEQuJzYXnESNZK60k7aVQ?pwd6666https://pan.baidu.com/s/1CdEQuJzYXnESNZK60k7aVQ?pwd6666链接&#xff1a;https://pan.baidu.com/s/1CdEQuJzYXnESNZK60k7a…

Kioxia的NVMe RAID卸载有何亮点?

随着每一代固态硬盘SSD的速度不断提升&#xff0c;RAID阵列面临着一个重大的挑战&#xff1a;如何有效地维持并扩展性能。即使是通过专门的RAID卡来处理RAID操作的情况下&#xff0c;例如在RAID 5阵列中&#xff0c;简单的写请求也需要涉及两次读取和两次写入不同的SSD。如果没…

ENVI SARscape||笔记

介绍就不介绍了&#xff0c;直入主题&#xff01; 第一章 ENVI和SARscape 下载与安装&#xff1a; ENVI 5.6 软件安装包下载及安装激活教程&#xff01; (qq.com)https://mp.weixin.qq.com/s/kH0g5g9AALgDNPssfdZ8wQ 启动 ENVI 的启动模式有两种&#xff1a;ENVI和ENVIIDL&…

鸿蒙 tabs 底部中间凸出

1, 先看效果 2, 直接cv代码-- 先修改一下 资源配置 图标使用自己的 color.json配置 {"integer": [{"name": "tab_row_column_image_width","value": 24},{"name": "tab_row_column_image_height","value&qu…

Vue面试常见知识总结2——spa、vue按需加载、mvc与mvvm、vue的生命周期、Vue2与Vue3区别

SPA SPA&#xff08;Single Page Application&#xff0c;单页面应用&#xff09;是一种Web应用程序架构&#xff0c;其核心特点是在用户与应用程序交互时&#xff0c;不重新加载整个页面&#xff0c;而是通过异步加载页面的局部内容或使用JavaScript动态更新页面。以下是对SPA…

【QT】增加注释模板

为了增加项目可读性&#xff0c;增加注释模板 选择工具->外部->配置… &#xff0c;再次选择“文本编辑器”->“片段”->“添加”&#xff0c;触发命名为header_customer,点击应用&#xff0c;按照下面的模板编排,再次点击应用&#xff0c; /*******************…

【第0004页 · 递归】生成括号对

【前言】本文以及之后的一些题解都会陆续整理到目录中&#xff0c;若想了解全部题解整理&#xff0c;请看这里&#xff1a; 第0004页 生成括号对 今天这题有点难绷&#xff0c;从某种程度上来说应该是第二次写这个问题了&#xff0c;但还是卡住了&#xff0c;现在我们来看一下…

2018CCPC网络赛 C - Dream

题意 给定一个P,现在可以以任意方式重载‘’和‘*’两个符号,使得满足下列等式 其中定义如下 需要注意的是,重载过后的*需要满足以下要求: 也就是说,重载‘*’之后通过计算得到的(k1,2,3,...,p-1)的取值对于集合{1,2,3,...,p-1}是一个一一映射的关系 ​​​​最后输出2*p行,按…

如何在windows中使用hfd.sh aria2c下载huggingface文件

这里写目录标题 简介hfd.sh使用方法windows系统安装aria2c aria2c官方文档&#xff1a; https://aria2.github.io/manual/en/html/aria2c.html 简介 我们在下载huggingface上模型权重的时候&#xff0c;要么在浏览器上直接下&#xff0c;要么使用官方下载程序。浏览器上还得一…

Lagent 自定义 Agent 智能体

准备 安安装环境 mindsearch 工具 画图工具

算法设计与分析:实验五 图论——桥问题

实验内容&#xff1a; 1. 桥的定义 在图论中&#xff0c;一条边被称为“桥”代表这条边一旦被删除&#xff0c;这张图的连通块数量会增加。等价地说&#xff0c;一条边是一座桥当且仅当这条边不在任何环上。一张图可以有零或多座桥。 2. 求解问题 找出一个无向图中所有的桥…

用MATLAB 画一个64QAM的星座图

由于QAM采用幅度和相位二维调制&#xff0c;其频谱效率大大提高&#xff0c;而且不同点的欧式距离也要大于调幅AM调制方式&#xff0c;QAM也是LTE和5G NR首选的调制方式&#xff0c;本期教大家画一个64QAM的星座图。 如下&#xff1a; 首先产生一个64QAM的调制数据&#xff0…

18044 成绩等级评分

### 思路 1. 从键盘输入一个整数成绩。 2. 判断成绩是否在0到100之间&#xff1a; - 如果不在范围内&#xff0c;输出“error”。 - 如果在范围内&#xff0c;根据成绩范围输出对应的等级&#xff1a; - 90分以上为A - 80到89分为B - 70到79分为C - …

数仓架构:离线数仓、实时数仓Lambda和Kappa、湖仓一体数据湖

往期推荐 大数据HBase图文简介-CSDN博客 数仓分层ODS、DWD、DWM、DWS、DIM、DM、ADS-CSDN博客 数仓常见名词解析和名词之间的关系-CSDN博客 目录 往期推荐 1. 数仓架构 1.1 离线数仓架构 1.1.1 数据集市架构 1.1.1.2 独立数据集市 1.1.1.2 从属数据集市 1.1.2 Inmon企…

Java的线程池简述

线程池的工作原理 线程池是为了减少频繁的创建线程和销毁线程带来的性能损耗&#xff0c;线程池的工作原理如下图&#xff1a; 线程池分为核心线程池&#xff0c;线程池的最大容量&#xff0c;还有等待任务的队列&#xff0c;提交一个任务&#xff0c;如果核心线程没有满&…

基于SpringBoot+Vue+MySQL的宠物寄养服务管理系统

系统背景 互联网社会的到来&#xff0c;让各行各业通过互联网实现了浴火重生的可能&#xff0c;每个行业都发现了完全可以使用互联网技术用来提高信息在内部的传递效率&#xff0c;提高管理水准。通过本次对宠物寄养服务系统的设计和开发&#xff0c;不仅能巩固已经学到的知识&…