说明
- 通常情况下,SpringBoot打包生成的fat jar太大了,所有的依赖jar包都放置到fat jar里,对于多模块的应用而言,任何的改动,都需要进行整体的打包发布上线,相对于war包中直接更新WEB-INF/lib下的jar而言,显得很繁琐,因此,可以考虑使用
maven-jar-plugin
+maven-assembly-plugin
的方式,修改SpringBoot打包的结构,从而,方便进行依赖jar的改动。另一种方式是maven-jar-plugin
+maven-dependency-plugin
。 -
maven-assembly-plugin
插件的配置分两部分-maven插件本身的配置(plugin的configuration)、插件的额外配置(打包描述文件pkg.xml)。 - maven-assembly-plugin的描述符配置官方文档
- maven-assembly-plugin作为maven插件的配置官方文档
pom.xml的build配置–maven插件本身的配置
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<!-- 一定不要使用springboot的maven插件,否则用于执行的jar仍然是很大的,依赖jar包并不会被拆分出来 -->
<!--<plugin>-->
<!--<groupId>org.springframework.boot</groupId>-->
<!--<artifactId>spring-boot-maven-plugin</artifactId>-->
<!--</plugin>-->
<!-- 不使用springboot的打包方式,引入jar插件 -->
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.bjqs.test.deploy.ApiApp</mainClass><!-- 指定需要运行的main方法所在类 -->
<classpathPrefix>lib</classpathPrefix><!-- 可以不是lib,需要与assembly的描述文件中(pkg.xml),依赖的存放位置一致即可 -->
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
</plugin>
<!-- 引入assembly插件 -->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<descriptor>src/assembly/pkg.xml</descriptor><!-- 指定自定义打包结构的描述文件位置 -->
</descriptors>
<finalName>${project.build.finalName}</finalName><!-- 指定最终生成的jar包的名称 -->
<encoding>UTF-8</encoding>
</configuration>
<executions>
<execution>
<id>assembly</id>
<goals>
<goal>single</goal>
</goals>
<phase>package</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
说明
maven-assembly-plugin
插件配置自定义描述文件,文件名可以随便起,位置随意,只要在descriptor
节点能正确指向这个文件即可。
打包描述文件pkg.xml的配置–assembly插件的额外配置
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.6.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.6.0 http://maven.apache.org/xsd/assembly-2.6.0.xsd">
<id>bin</id><!-- assembly的插件配置appendAssemblyId为true时,生成的jar会带这个'bin' -->
<formats>
<format>dir</format><!-- 打一个文件夹包,一般用于直接在开发电脑上运行 -->
<format>zip</format><!-- zip压缩包,上传到服务器,需要unzip解压后才可以运行,内容跟dir一样-->
<format>tgz</format><!-- tar.gz或tgz包,tar -zxf 解压 -->
</formats>
<includeBaseDirectory>true</includeBaseDirectory><!-- dir及压缩时是否包含基本目录 -->
<baseDirectory>release</baseDirectory><!-- fileSets中的内容将输出到这个目录下 -->
<fileSets><!-- 用于配置文件集,自定义打包结构的核心配置之一 -->
<!-- 加载启停脚本 -->
<fileSet>
<useDefaultExcludes>true</useDefaultExcludes>
<directory>${project.basedir}</directory>
<outputDirectory>.</outputDirectory>
<fileMode>0744</fileMode>
<lineEnding>unix</lineEnding>
<includes>
<include>*.bat</include>
<include>*.sh</include>
<include>*.md</include>
<include>*.txt</include>
</includes>
<filtered>true</filtered><!-- 启用过滤,则脚本中的部分${xxx}形式的表达式可以进行替换为实际值-->
</fileSet>
<!-- 加载配置到config --><!-- SpringBoot默认最高优先级是config下的配置 -->
<fileSet>
<useDefaultExcludes>true</useDefaultExcludes>
<directory>${project.build.outputDirectory}</directory>
<outputDirectory>config</outputDirectory>
<lineEnding>unix</lineEnding>
<includes>
<include>*.yml</include>
<include>*.xml</include>
<include>*.txt</include>
</includes>
</fileSet>
<!-- 加载打包的jar,这个jar包含了main方法,执行时,执行这个jar,由maven-jar-plugin打包生成的 -->
<fileSet>
<useDefaultExcludes>true</useDefaultExcludes>
<directory>${project.build.directory}</directory>
<outputDirectory>.</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
<!-- 依赖的处理,自定义打包结构的核心配置之二 -->
<dependencySets>
<dependencySet>
<outputDirectory>lib</outputDirectory><!-- 此处的文件夹路径与pom中maven-jar-plugin中classpath前缀一致即可,否则启动jar会提示ClassNotFound问题 -->
<unpack>false</unpack><!-- 不要解压依赖jar -->
<scope>runtime</scope><!-- 将runtime依赖复制到lib目录 -->
<useProjectArtifact>false</useProjectArtifact><!-- 不将可执行jar复制到lib目录,默认是true -->
</dependencySet>
</dependencySets>
</assembly>
说明
编写好上述配置后,对工程项目或者可执行jar所在模块,执行mvn clean package
或者mvn clean install
等待执行完毕即可得到如下结果。
target:
├─classes
│
├─test-mgr -- 最终的名称
│ └─release -- 打包基础目录
│ ├─test-mgr.jar -- 可执行jar
│ │
│ ├─config -- 配置存放目录
│ │ │
│ │ └─application.yml -- 配置文件
│ │
│ ├─lib -- 依赖jar存放目录
│ │ │
│ │ └─spring-boot-starter-web.jar -- 依赖jar包
│ │
│ ├─start.sh -- 启停脚本
│ │
│ └─README.MD -- 说明文件
│
├─test-mgr.jar -- mavenen-jar-plugin生成的可执行jar,包含main方法
│
├─test-mgr.zip -- 内部是release目录的zip压缩包
│
└─test-mgr.tgz -- 内部是release目录的tgz压缩包