Maven打包之maven-assembly-plugin

打包是一个比较头疼的事情,默认maven打包的结果只包含项目本身的代码,如果要执行代码,还得带上依赖。如果希望将所有依赖放到指定的文件夹下,再在目录下写入shell脚本等之类的事情。maven-shade-plugin插件不能满足需求,而maven-assembly-plugin插件能够帮我们合理地归档文件。

简单的使用

assembly提供了几种默认的打包方式,使用 descriptorRefs, descriptorRef 有 bin, jar-with-dependencies, src, project。【不建议使用】

1
2
3
4
5
6
7
8
9
10
11
12
13
<plugins>
<plugin>
<!-- NOTE: We don't need a groupId specification because the group is
org.apache.maven.plugins ...which is assumed by default.
-->
<artifactId>maven-assembly-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>

descriptor使用原理

assembly允许用户自定义归档文件格式,位置,结构等信息。允许配置并执行多个自定义配置。

所以每一个配置都需要一个唯一id来做区分。归档格式可以有tar.gz,dir,zip,war等等,允许同时归档出多种格式文件。对于打的jar包,可以指定输出目录。对于一组特定的文件,可以指定存放的文件夹。如果有单独需要存放的文件,也可以单独处理。

assembly配置

assembly配置分为两部分,一部分是assembly的配置文件,一部分是在pom.xml中的配置。

assembly配置文件

首先我们通过以下配置文件了解一下配置文件是怎么工作的。

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
56
57
58
59
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd
http://maven.apache.org/ASSEMBLY/2.0.0 ">

<!--唯一ID-->
<id>assembly_test</id>

<!--打包格式,允许同时有多个-->
<formats>
<format>tar.gz</format>
<format>dir</format>
<format>zip</format>
</formats>

<!--依赖jar包以及项目打包文件存储文件-->
<dependencySets>
<dependencySet>
<!--存储在projectName-assembly-version/lib下-->
<outputDirectory>lib</outputDirectory>
</dependencySet>
</dependencySets>

<fileSets>
<fileSet>
<!--目录路径,如果不在这里指定,而在include中指定,那么其文件夹的也会被带进去-->
<directory>src/main/bin/</directory>
<includes>
<!--要哪些文件-->
<include>*.*</include>
</includes>
<excludes>
<!--不要哪些文件-->
<exclude>*.no_need</exclude>
</excludes>
<!--文件的权限-->
<fileMode>0755</fileMode>
<!--输出目录 存储在projectName-assembly-version/bin下-->
<outputDirectory>bin</outputDirectory>
<directoryMode>0755</directoryMode>

</fileSet>
</fileSets>

<files>
<!--针对单个文件-->
<file>
<!--源文件地址,相对于项目地址-->
<source>pom.xml</source>
<!--输出目录为projectName-assembly-version/-->
<outputDirectory>.</outputDirectory>
<!--文件的权限-->
<fileMode>0755</fileMode>
<!--重命名为-->
<destName>pom.xml</destName>
</file>
</files>

</assembly>

pom中的配置

assembly插件在pom中配置较为简单,但需要配置maven自带的插件实现main方法添加和classpath依赖。假设上边的assembly配置文件在src/main/assembly/assembly.xml

pom配置内容为

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
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.1</version>
<configuration>
<archive>
<manifest>
<!--运行jar包时运行的主类,要求类全名-->
<mainClass>com.gavinzh.learn.assembly.Main</mainClass>
<!-- 是否指定项目classpath下的依赖 -->
<addClasspath>true</addClasspath>
<!-- 指定依赖的时候声明前缀 -->
<!--<classpathPrefix>./</classpathPrefix>-->
</manifest>
</archive>
</configuration>
</plugin>

<plugin>
<!-- NOTE: We don't need a groupId specification because the group is
org.apache.maven.plugins ...which is assumed by default.
-->
<artifactId>maven-assembly-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<descriptors>
<descriptor>src/main/assembly/assembly.xml</descriptor>
</descriptors>
</configuration>

<executions>
<execution>
<id>assembly_test</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>


</plugins>
</build>

参考

Apache Maven Assembly Plugin

maven-assembly-plugin 简书