背景
平常开发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——替换脚本文件中的占位参数,并将项目文件按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生命周期处理方式和各插件的配置项的功能。