maven-assembly-plugin打包Spring-Bo
2021-12-14 本文已影响0人
侧身打腿
Spring-Boot工程打包
结合maven相关插件,实现如下打包目标:
- 开发代码和依赖库分离
- 配置文件分离
1. 目标
- 开发代码和依赖库分离
- 配置文件分离
2. 背景
Spring-Boot工程默认采用spring-boot-maven-plugin
(springboot-maven-plugin)插件进行打包。该插件会将开发代码、依赖库以及静态文件全部打包至一个jar包中,官方称该jar包为fat jar
。
该jar包本质是一个压缩文件,可以通过解压工具打开,其目录结构如下:
|-- BOOT-INF
| |-- classes 开发的类及配置文件等
| |-- classpath.idx
| `-- lib 依赖库
|-- META-INF
| |-- MANIFEST.MF
| `-- maven
`-- org
`-- springframework
2.1. 优缺点
采用默认方式的优点很明显就是简单。
由于所有文件都在一个jar中,在某些场景下也存在一些不足。首先就是由于包含依赖,该jar体积会较大,即使不再调整依赖每次上线也得重新将依赖推至生产服务器;另外,由于配置文件包含在jar中,对于运维来说不太友好。
3. 解决方法
结合使用如下maven插件:
- maven-jar-plugin
- maven-dependency-plugin
- maven-assembly-plugin
注:后文所有插件的配置均在pom.xml的build -> plugins
标签下
3.1. 工程目录约定
假设工程目录结构如下:
|-- README.md
|-- pom.xml
|-- src
| `-- main
| |-- bin 保存启停脚本
| |-- build 保存构建配置(assembly插件配置)
| |-- java java代码
| `-- resources 资源文件
| `-- config 配置文件目录
`-- dist 最终打包产物输出目录(maven-assembly-plugin)
3.2. 插件配置
3.2.1. maven-jar-plugin配置
功能:将开发的代码打包为jar。同时将类路径添加前缀,因为后续会将依赖位置会在此jar的同级的lib目录中。
pom.xml配置maven-jar-plugin部分:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<!--启动类-->
<mainClass>pengchen.demo.App</mainClass>
<!--添加类路径前缀,因为最终的依赖包会放在lib目录下-->
<classpathPrefix>lib</classpathPrefix>
<addClasspath>true</addClasspath>
</manifest>
</archive>
<excludes>
<!--避免将配置文件打包到开发代码生成的jar中-->
<!--assembly会将config目录打包到输出物的根目录下-->
<exclude>config/**</exclude>
</excludes>
</configuration>
</plugin>
3.2.2. maven-dependency-plugin配置
功能:将依赖包打包至lib目录中。
pom.xml配置maven-dependency-plugin部分:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!-- 将依赖放到target/lib目录下 -->
<outputDirectory>target/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
3.2.3. maven-assembly-plugin配置
功能:将配置文件、启动脚本、依赖包及开发代码的jar放到合适的位置并对开发代码生成的jar包按指定规则命名,最终将所有文件添加到压缩包。
pom.xml配置maven-assembly-plugin部分:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<descriptors>
<!--指定assembly配置文件位置-->
<descriptor>src/main/build/assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>bundle</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
assembly.xml配置(src/main/build/assembly.xml):
<assembly>
<id>bundle</id>
<formats>
<format>tar.gz</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<!-- 启停脚本 -->
<fileSet>
<directory>${basedir}/src/main/bin</directory>
<includes>
<include>*.sh</include>
</includes>
<outputDirectory>${file.separator}bin</outputDirectory>
</fileSet>
<!-- 配置文件 -->
<fileSet>
<directory>${basedir}/target/classes/config</directory>
<outputDirectory>${file.separator}config</outputDirectory>
</fileSet>
<!-- 依赖库 -->
<fileSet>
<directory>${basedir}/target/lib</directory>
<includes>
<include>*.jar</include>
</includes>
<outputDirectory>lib</outputDirectory>
</fileSet>
<!-- 可执行的jar -->
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>${project.artifactId}-${project.version}.jar</include>
</includes>
</fileSet>
</fileSets>
</assembly>
3.3. 打包步骤
mvn package
3.4. 输出物说明
在工程dist目录下会生成一个.tar.gz
文件,这便是我们最终的产出物。
解压后目录结构如下:
|-- assembly-with-springboot-demo-1.0-SNAPSHOT.jar 开发代码生成的jar包
|-- bin 启停脚本目录
| `-- run.sh
|-- config 配置文件目录
| `-- application.properties
`-- lib 依赖库目录
|-- jackson-annotations-2.11.4.jar
... 其他依赖包
3.4. 运行
采用此种方式配置不影响IDE中原来的运行方式。针对打包后代码的运行也是直接通过java -jar命令执行。