0%

maven打包插件-assembly

简介

Assembly 插件使开发人员能够将项目输出组合到一个可分发的存档中,该存档还包含依赖项、模块、站点文档和其他文件。目前它可以创建以下格式的发行版:

  • zip
  • tar
  • tar.gz(or tgz)
  • tar.bz2 (or tbz2)
  • tar.snappy
  • tar.xz (or txz)
  • jar
  • dir
  • war
  • and any other format that the ArchiveManager has been configured for

程序集和组件描述符模式 (XSD)

xsd描述对应各自版本:

描述符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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<!--schemaLocationassembly版本对应关系如上 -->
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.1 https://maven.apache.org/xsd/assembly-2.1.1.xsd">
<!--设置此程序集的 id。这是来自该项目的特定文件程序集的符号名称。此外,除了用于通过将其值附加到生成的存档来明确命名组装包之外,该 id 在部署时用作工件的分类器。 -->
<id/>
<!--通过在 <format> 子元素中提供zip、tar等来指定格式,Assembly Plugin 将为每种所需格式生成一个存档。 -->
<formats/>
<!--boolean类型 在最终存档中包含一个基本目录。例如,如果您正在创建一个名为“your-app”的程序集,将 includeBaseDirectory 设置为 true 将创建一个包含此基本目录的存档。如果此选项设置为 false,则创建的存档会将其内容解压缩到当前目录。 默认true -->
<includeBaseDirectory/>
<!-- 设置生成的程序集存档的基本目录。如果未设置且 includeBaseDirectory == true,则将使用 ${project.build.finalName}。 (从 2.2-beta-1 开始)-->
<baseDirectory/>
<!--boolean类型 在最终存档中包含一个站点目录。项目的站点目录位置由 Assembly Plugin 的 siteDirectory 参数确定。 -->
<includeSiteDirectory/>
<!--为进入程序集存档的文件配置过滤器,以启用各种类型的描述符片段的聚合,例如 components.xml、web.xml 等。默认false -->
<containerDescriptorHandlers>
<containerDescriptorHandler>
<!--处理程序的 plexus 角色提示,用于从容器中查找。 -->
<handlerName/>
<!-- 处理程序的配置选项。-->
<configuration/>
</containerDescriptorHandler>
</containerDescriptorHandlers>
<!-- 指定要包含在程序集中的模块文件。通过提供一个或多个 <moduleSet> 子元素来指定模块集。-->
<moduleSets>
<moduleSet>
<!--boolean类型 如果设置为 true,插件将包含当前反应器中的所有项目以在此 ModuleSet 中进行处理。这些将受包含/排除规则的约束。默认false -->
<useAllReactorProjects/>
<!--boolean类型 如果设置为 false,插件将在此 ModuleSet 中排除子模块的处理。否则,它将处理所有子模块,每个子模块都遵循包含/排除规则。默认值true -->
<includeSubModules/>
<!--字符串集合 当 <include> 子元素存在时,它们定义了一组要包含的项目坐标。如果不存在,则 <includes> 表示所有有效值。工件坐标可以以简单的 groupId:artifactId 形式给出,或者它们可以完全限定为 groupId:artifactId:type[:classifier]:version 形式。-->
<includes/>
<!--字符串集合 当 <exclude> 子元素存在时,它们定义了一组要排除的项目工件坐标。如果不存在,则 <excludes> 表示没有排除。工件坐标可以以简单的 groupId:artifactId 形式给出,或者它们可以完全限定为 groupId:artifactId:type[:classifier]:version 形式。-->
<excludes/>
<!-- 当它存在时,插件将在生成的程序集中包含来自该集合的包含模块的源文件。-->
<sources>
<useDefaultExcludes/>
<outputDirectory/>
<includes/>
<excludes/>
<fileMode/>
<directoryMode/>
<fileSets>
<fileSet>
<useDefaultExcludes/>
<outputDirectory/>
<includes/>
<excludes/>
<fileMode/>
<directoryMode/>
<directory/>
<lineEnding/>
<filtered/>
<nonFilteredFileExtensions/>
</fileSet>
</fileSets>
<includeModuleDirectory/>
<excludeSubModuleDirectories/>
<outputDirectoryMapping/>
</sources>
<!--当它存在时,插件将在生成的程序集中包含来自该集合的包含模块的二进制文件。 -->
<binaries>
<outputDirectory/>
<includes/>
<excludes/>
<fileMode/>
<directoryMode/>
<attachmentClassifier/>
<includeDependencies/>
<dependencySets>
<dependencySet>
<outputDirectory/>
<includes/>
<excludes/>
<fileMode/>
<directoryMode/>
<useStrictFiltering/>
<outputFileNameMapping/>
<unpack/>
<unpackOptions>
<includes/>
<excludes/>
<filtered/>
<nonFilteredFileExtensions/>
<lineEnding/>
<useDefaultExcludes/>
<encoding/>
</unpackOptions>
<scope/>
<useProjectArtifact/>
<useProjectAttachments/>
<useTransitiveDependencies/>
<useTransitiveFiltering/>
</dependencySet>
</dependencySets>
<unpack/>
<unpackOptions>
<includes/>
<excludes/>
<filtered/>
<nonFilteredFileExtensions/>
<lineEnding/>
<useDefaultExcludes/>
<encoding/>
</unpackOptions>
<outputFileNameMapping/>
</binaries>
</moduleSet>
</moduleSets>
<!-- 文件集允许将文件组包含到程序集中。-->
<fileSets>
<fileSet>
<!--在计算受此集合影响的文件时,是否应使用标准排除模式,例如匹配 CVS 和 Subversion 元数据文件的排除模式。为了向后兼容,默认值为 true。 -->
<useDefaultExcludes/>
<!-- 设置相对于程序集根目录的根目录的输出目录。-->
<outputDirectory/>
<!-- 当 <include> 子元素存在时,它们定义了一组要包含的文件和目录。如果不存在,则 <includes> 表示所有有效值。-->
<includes/>
<!-- 当 <exclude> 子元素存在时,它们定义了一组要排除的文件和目录。如果不存在,则 <excludes> 表示没有排除。-->
<excludes/>
<!-- 与 UNIX 权限类似,设置所包含文件的文件模式。这是一个八进制值。格式:(User)(Group)(Other) 其中每个组件是 Read = 4、Write = 2 和 Execute = 1 的总和-->
<fileMode/>
<!-- UNIX 权限类似,设置所包含目录的目录模式。这是一个八进制值。格式:(User)(Group)(Other) 其中每个组件是 Read = 4、Write = 2 和 Execute = 1 的总和。例如,值 0755 转换为 User read-write、Group 和 Other 只读.默认值为 0755。-->
<directoryMode/>
<!-- 设置模块目录的绝对或相对位置。例如,“src/main/bin”将选择定义此依赖项的项目的此子目录。-->
<directory/>
<!--设置此 fileSet 中文件的行尾。有效值:keep、unix、if、dos、windows、crlf -->
<lineEnding/>
<!-- 是否使用构建配置中的属性在复制文件时过滤文件中的符号-->
<filtered/>
<!-- 不应用过滤的附加文件扩展名-->
<nonFilteredFileExtensions/>
</fileSet>
</fileSets>
<files>
<file>
<source/>
<sources/>
<outputDirectory/>
<destName/>
<fileMode/>
<lineEnding/>
<filtered/>
</file>
</files>
<!--dependencySet 允许在程序集中包含和排除项目依赖项。-->
<dependencySets>
<dependencySet>
<!-- 设置相对于程序集根目录的根目录的输出目录。-->
<outputDirectory/>
<!-- 当 <include> 子元素存在时,它们定义了一组要包含的工件坐标。如果不存在,则 <includes> 表示所有有效值。-->
<includes/>
<!-- 当 <exclude> 子元素存在时,它们定义了一组要排除的依赖工件坐标。如果不存在,则 <excludes> 表示没有排除。-->
<excludes/>
<fileMode/>
<directoryMode/>
<!--当指定为 true 时,任何在程序集创建期间不用于过滤实际工件的包含/排除模式都将导致构建失败并出现错误。这是为了突出显示过时的包含或排除,或者表示程序集描述符配置不正确。 -->
<useStrictFiltering/>
<!-- 设置此程序集中包含的所有依赖项的映射模式-->
<outputFileNameMapping/>
<!--如果设置为 true,此属性会将所有依赖项解压缩到指定的输出目录中。当设置为 false 时,依赖项将被包含为档案(jar)-->
<unpack/>
<!-- 解包选项 允许从依赖项工件中解包的项目的包含和排除规范以及过滤选项。-->
<unpackOptions>
<includes/>
<excludes/>
<filtered/>
<nonFilteredFileExtensions/>
<lineEnding/>
<useDefaultExcludes/>
<!-- -->
<encoding/>
</unpackOptions>
<!-- 设置此dependencySet 的依赖范围。-->
<scope/>
<!--boolean类型 确定当前项目构建期间生成的工件是否应包含在此依赖集中 默认值true-->
<useProjectArtifact/>
<!--boolean类型 确定当前项目构建期间生成的附加工件是否应包含在此依赖项集中。 默认值false-->
<useProjectAttachments/>
<!--boolean类型 确定传递依赖是否将包含在当前依赖集的处理中。如果为 true,includes/excludes/useTransitiveFiltering 将应用于除了主要项目依赖项工件之外的传递依赖项工件。如果为 false,则 useTransitiveFiltering 没有意义,包含/排除只影响项目的直接依赖关系。默认情况下,此值为 true-->
<useTransitiveDependencies/>
<!-- 确定此依赖集中的包含/排除模式是否将应用于给定工件的传递路径。如果为真,并且当前工件是由与包含或排除模式匹配的另一个工件引入的传递依赖项,则当前工件也应用相同的包含/排除逻辑。默认情况下,此值为 false-->
<useTransitiveFiltering/>
</dependencySet>
</dependencySets>
<!--自模型版本 2.1.1 起已弃用。 -->
<repositories>
<repository>
<outputDirectory/>
<includes/>
<excludes/>
<fileMode/>
<directoryMode/>
<includeMetadata/>
<groupVersionAlignments>
<groupVersionAlignment>
<id/>
<version/>
<excludes/>
</groupVersionAlignment>
</groupVersionAlignments>
<scope/>
</repository>
</repositories>
<!-- 通过提供一个或多个 <componentDescriptor> 子元素来指定 componentDescriptor。-->
<componentDescriptors/>
</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
<plugins>
<plugin>
<!-- 配置插件坐标 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.6</version>
<!-- 配置执行器 -->
<executions>
<execution>
<!-- 名称随意,最好与描述文件中的id一致,不一致也无所谓,只要文件路径写对也能找到 -->
<id>build-bin</id>
<!-- 绑定到package生命周期阶段上,该标签决定了该插件的作用 -->
<phase>package</phase>
<goals>
<!-- 只运行一次 -->
<goal>single</goal>
</goals>
<configuration>
<tarLongFileMode>gnu</tarLongFileMode>
<descriptors>
<!-- 配置描述文件路径,一般使用相对目录即可 -->
<descriptor>assembly.xml</descriptor>
</descriptors>
<outputDirectory>target</outputDirectory>
<!-- 自定义输出包的名称 -->
<finalName>platform-notify</finalName>
<!-- 该标签默认为true,指定为false后包名将不会自动带上描述文件的id -->
<appendAssemblyId>false</appendAssemblyId>
</configuration>
</execution>
</executions>
</plugin>
</plugins>

最后输出的文件名称由pom.xml中的finalName+assembly配置文件中的id,是否追加id取决于配置文件中的appendAssemblyId

常用到的两个变量:

  • ${project.build.finalName} : 采用项目的artifactId-version
  • ${basedir}:采用项目的根目录