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包部署https://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生命周期处理方式和各插件的配置项的功能。