SpringBoot打包分离资源文件

SpringBoot使用内置tomcat打包会非常简单,但是默认的SpringBoot的maven插件打包会将所有三方jar和配置文件打包成一个jar。但是在个人或者公司需要做一些小项目或者工具之类的,需要将三方jar包和配置文件分离。就需要利用maven插件来做打包了

SpringBoot打包

先来看下SpringBoot的插件的打包代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.web.Application</mainClass>
</configuration>
<executions>
<execution>
<goals>
<!--将三方jar打入jar中-->
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>

代码比较简单,不多介绍。

maven-jar-plugin

我使用的assembly打包的方式,当然方法肯定不止一种,由于这种成功了,就没有去尝试其他了。

在使用这种插件的时候先要接触另外一种插件maven-jar-plugin,这个插件主要目的是将主项目打包成jar,而且指定jar的资源路径(实际就是配置_MANIFEST.MF文件_)。可以查看官网地址!有详细说明。链接直接看我的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<archive>
<manifest>
<mainClass>com.scxx.web.ScxxApplication</mainClass>
<!--是否添加依赖-->
<addClasspath>true</addClasspath>
<!--路径项目前缀-->
<classpathPrefix>lib/</classpathPrefix>
</manifest>
<manifestEntries>
<!-- MANIFEST.MF Class-Path 加入资源文件目录 -->
<Class-Path>./</Class-Path>
</manifestEntries>
</archive>
<excludes>
<exclude>application-*.yml</exclude>
<exclude>config/**</exclude>
<exclude>build/**</exclude>
</excludes>
</configuration>
</plugin>

插件主要做的事情就是打包主项目jar,指定class-path路径。同时过滤掉不想打入jar包的文件。这样jar包就ok了。我们看下META-INF资源文件写了什么

1
2
3
4
5
6
7
8
9
10
11
12
Manifest-Version: 1.0
Implementation-Title: web
Implementation-Version: 0.0.1
Archiver-Version: Plexus Archiver
Implementation-Vendor-Id: com.scxx.tool
// 注意的 ./ 实际就是上面配置的Class-path
Class-Path: ./ lib/test-0.0.1.jar lib/base-0.0.1.jar *** (lib文件很多,我过滤掉了)
Created-By: Apache Maven 3.6.1
Build-Jdk: 1.8.0_131
Implementation-URL: https://projects.spring.io/spring-boot/#/spring-bo
ot-starter-parent/kit/web
Main-Class: com.web.Application

maven-assembly-plugin

接下来开始使用maven-assembly-plugin插件做压缩和资源整理。官网链接

直接看代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.6</version>
<configuration>
<!-- not append assembly id in release file name -->
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<descriptor>src/main/resources/build/release.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>

很普通,因为重点不是不在这里,主要在他指定的release.xml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>dist</id>
<formats>
<format>tar.gz</format>
</formats>
<includeBaseDirectory>true</includeBaseDirectory>
<dependencySets>
<dependencySet>
<!-- 排除自己的jar,因为这里我已经将他放在外面了-->
<useProjectArtifact>false</useProjectArtifact>
<!-- 资源文件路径,注意和上面的lib路径对应 -->
<outputDirectory>lib</outputDirectory>
<unpack>false</unpack>
</dependencySet>
</dependencySets>
<fileSets>
<!-- 把项目相关的执行文件和说明文件,打包进压缩文件的根目录 -->
<fileSet>
<!-- 项目路径 -->
<directory>${project.basedir}/src/main/resources/build</directory>
<!-- 输出到zip的路径 -->
<outputDirectory>./</outputDirectory>
<includes>
<include>*.txt</include>
<include>bin/**</include>
</includes>
</fileSet>
<!-- 把项目相关的db文件,打包进压缩文件的根目录 -->
<fileSet>
<directory>${project.basedir}/db</directory>
<outputDirectory>./db</outputDirectory>
</fileSet>
<!-- 把项目的基本配置文件,打包进压缩文件的根目录 -->
<fileSet>
<directory>${project.basedir}/src/main/resources</directory>
<outputDirectory />
<includes>
<include>application-release.yml</include>
<include>application-business.yml</include>
<include>*.xml</include>
<include>*.properties</include>
</includes>
</fileSet>
<!-- 把项目自己编译出来的jar文件,打包进压缩文件的根目录 -->
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory />
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
</assembly>

此处主要理解fileSet的使用即可。将自己需要的文件要按路径打包压缩文件中! 需要注意的点都已经写在里面了。每个人可以根据自己的需求来制定自己的打包方式。

也可以参考这个项目的打包方式!链接