当前位置: 首页 > article >正文

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——替换脚本文件中的占位参数,并将项目文件按需求打成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.kler.cn/news/282881.html

相关文章:

  • 18.神经网络 - 非线性激活
  • 【机器学习】梯度下降算法
  • 源码编译并安装Squid的方法
  • BEVDet4D:多帧时序信息融合方法详解
  • 富格林:正规方式顺利盈利出金
  • 性能测试的基本概念
  • Pycharm安装报错:Cannot detect a launch configuration 解决办法
  • 吴恩达机器学习笔记 四十五 基于内容的过滤的tensorFlow实现
  • 怎么解决 hash 碰撞,用 C++ 实现 hashMap?
  • Nosql数据库redis集群配置详解
  • Nginx轮询负载均衡配置指南:实现高效请求分发
  • docker常用命令使用dockerfile构建镜像,推送到私有镜像仓库
  • 【AI绘画】Midjourney前置指令/describe、/shorten详解
  • 适配算能BM1684开发板,bmodel推理模型转换
  • 矩阵分块乘法的证明
  • C语言典型例题55
  • VScode打开json文件和md文件直观展示方法
  • 免费批量Excel文件合并、拆分工具
  • Linux系统结构
  • 加密软件的特殊功能有哪些
  • STM32 - 按键控制LED灯
  • 在centos中安装 --nmon性能系统监控工具
  • 【实战场景】敏感词过滤如何实现?
  • 阿里最新发布Qwen2-VL:看视频的AI到底能干些什么惊人的事?
  • gui.js可视化插件的使用
  • 前端需调用后端数据作为判断条件
  • spring揭秘14-JdbcTemplate概述与使用操作对象访问数据
  • CSS 嵌套元素的隐藏规则
  • Spring Boot DevTools:简化开发,实现热部署
  • 棱镜七彩参编的又一国家标准正式发布!