SpringBoot应用打成ZIP部署包

 背景

        平常开发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配置:

<assemblyxmlns="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.rhkb.cn/news/414425.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「bug」nvitop ERROR: Failed to initialize curses

nvitop 作为一个优秀个 Nvidia显卡查询库&#xff0c;简单易用且显示信息十分丰富&#xff0c;相比 Nvidia-smi 更方便&#xff0c;简直是每个 开发人员必备的库&#xff0c;安装也十分方便&#xff0c;直接采用 pip install nvitop 即可&#xff0c;调用的时候也是直接在 Term…

Redis:Redis性能影响因素

这里写自定义目录标题 一、CPU对Redis的影响二、磁盘对Redis的影响三、网络对Redis的影响四、Swap对Redis的影响 一、CPU对Redis的影响 二、磁盘对Redis的影响 性能建议&#xff1a; 如果是热点场景&#xff0c;建议大家关闭rdb和aof。在SATA和SAS普通盘上&#xff0c;append…

RocketMQ集群搭建,及RocketMQ-Dashboard部署(前RocketMQ-Console)

集群搭建 RocketMQ不支持单主机搭建主从结构集群&#xff0c;当从节点启动时&#xff0c;即使和主节点设置不同的监听端口&#xff0c;他也要去监听主节点端口&#xff0c;也就是说正常启动的从节点会监听四个端口。原因未知&#xff0c;现象后面会列举出来。 1. 准备JAVA环境…

c++应用网络编程之八SOCKET探究

一、socket 在目前主流的网络通信中&#xff0c;SOCKET编程其实就是网络编程的代名词。在前面反复提到socket&#xff0c;那么socket到底是什么呢&#xff1f;英文的愿意是“插座、槽”的意思。这里虽然不讲解传统的网络协议但不得不简单说明一下。 首先从宏观上看&#xff0c…

超声波模块

HCSR04超声波模块是一种常用的测距模块&#xff0c;它通过检测超声波发射后遇到障碍物所反射的回波&#xff0c;从而测量出与障碍物之间的距离。以下是对HCSR04超声波模块的详细讲解&#xff1a; 一、模块组成与工作原理 组成&#xff1a;HCSR04超声波模块主要由两个压电陶瓷超…

Python一些可能用的到的函数系列131 发送钉钉机器人消息

说明 来自顾同学的助攻 钉钉机器人可以用来发送一些重要的系统消息&#xff0c;例如磁盘将满等等。原本还可以有更强的功能&#xff0c;就是监听群里的消息&#xff0c;然后做出反应&#xff0c;不过这个好像要买企业版&#xff0c;贵的毫无意义。 钉钉发消息有几种模式&#…

Ubuntu18.04 下安装CUDA

安装步骤 1.查看是否安装了cuda # 法1 cat /usr/local/cuda/version.txt # 法2 nvcc --version 2.若没有安装&#xff0c;则查看是否有N卡驱动&#xff0c;若无N卡驱动&#xff0c;则到软件与更新 -> 附加驱动中安装驱动 3.查看N卡驱动支持的cuda版本 nvidia-smi 如下…

VS+C++VTK-VCG三维网格模型鼠标框选拉普拉斯局部平滑

程序示例精选 VSCVTK-VCG三维网格模型鼠标框选拉普拉斯局部平滑 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《VSCVTK-VCG三维网格模型鼠标框选拉普拉斯局部平滑》编写代码&#xff0c;代…

扑捉一只耿鬼(HTML文件)

图例&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>耿鬼</title><style>body {background: #fff;font-family: Comfortaa, sans-serif;}* {box-sizing:…

【Kubernetes】持久卷的动态供给 Dynamic Provisioning

《持久化存储》系列&#xff0c;共包含以下文章&#xff1a; K8s 持久化存储方式持久卷 PV持久卷声明 PVC持久卷的动态供给 Dynamic Provisioning &#x1f60a; 如果您觉得这篇文章有用 ✔️ 的话&#xff0c;请给博主一个一键三连 &#x1f680;&#x1f680;&#x1f680; …

C++实现文件加解密及OllyDbg逆向

一.PE病毒和WannaCry勒索蠕虫 1.PE病毒 什么是PE病毒&#xff1f; PE病毒是以Windows PE程序为载体&#xff0c;能寄生于PE文件或Windows系统的病毒程序。PE病毒数量非常之多&#xff0c;包括早起的CIH病毒&#xff0c;全球第一个可以破坏计算机硬件的病毒&#xff0c;它会破…

Linux和Unix的区别及为什么鸿蒙系统不用Unix的原因

目录 Linux是什么? Unix是什么&#xff1f; 他们的区别&#xff1a; 鸿蒙系统介绍及鸿蒙系统不用Unix的原因 Linux是什么? Linux的历史可以追溯到1991年&#xff0c;由芬兰的计算机科学家林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;为了学习操作系统的工作原理而…

计算机毕设选题推荐-基于python的豆瓣电子图书数据可视化分析

&#x1f496;&#x1f525;作者主页&#xff1a;毕设木哥 精彩专栏推荐订阅&#xff1a;在 下方专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; 实战项目 文章目录 实战项目 一、基于python的豆瓣电子图书数…

计算机毕业设计Hadoop+Spark抖音可视化 抖音舆情监测 预测算法 抖音爬虫 抖音大数据 情感分析 NLP 自然语言处理 Hive 机器学习 深度学习

技术栈&#xff1a;数据分析Spark、数据库Hive MySQL、服务器djano、爬虫requests jieba库中文分词&#xff0c;通俗来说&#xff0c;就是将一句(段)话按一定的规则(算法)拆分成词语、成语、单个文字。 中文分词是很多应用技术的前置技术&#xff0c;如搜索引擎、机器翻译、词…

SprinBoot+Vue学生选课小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…

C#上位机采用数据库操作方式对Excel或WPS表格进行读取操作

C#采用数据库操作方式对Excel或WPS表格进行读取操作 1、创建连接字符串并编写一个进行数据库操作的方法 public class OleDbHelper{//创建连接字符串private static string connString "ProviderMicrosoft.ACE.OLEDB.12.0;Data Source{0};" "Extended Propert…

tecplot宏批量导入数据

Tecplot新手进阶——使用tecplot宏操作批量处理数据输出图片&#xff08;详细步骤&#xff09; tecplot 宏的使用方法及代码改写 第一步&#xff1a;首先点击Scripting–>Record Macro&#xff0c;生成一个脚本文件&#xff0c;即.mcr文件 点击保存&#xff0c;会出现这个…

SpringBoot实战:Spring Boot项目使用SM4国密加密算法

引言 在业务系统构建与部署的环节中&#xff0c;数据库作为核心存储组件&#xff0c;其连接信息的安全至关重要。通常情况下&#xff0c;这些敏感信息&#xff0c;如数据库密码&#xff0c;会直接以明文形式存储在YAML配置文件中&#xff0c;这无疑增加了信息泄露的风险。为有效…

活动系统开发之采用设计模式与非设计模式的区别-需求整理

用户需求(活动系统)&#xff1a; 1、活动类型&#xff1a;答题、图片展示、签到、抽奖、组团等活动 2、活动介绍&#xff1a; a、答题活动&#xff1a; 第一种是签到后&#xff0c;随机抽取10道题&#xff0c;答对8到就可以抽奖&#xff1b; 第二种是随机抽取一道题&#xff0…

Call openai-node in the backend or call https in the frontend?

题意&#xff1a;在后端调用 openai-node 还是在前端调用 https&#xff1f; 问题背景&#xff1a; I have a web application by ReactJS and Nodejs. This application calls OpenAI APIs. 我有一个使用 ReactJS 和 Node.js 开发的 Web 应用程序。这个应用程序调用 OpenAI …