maven-assembly-plugin的使用
- Assembly程序集
- maven的Assembly Plugin依赖于提供的程序集描述符来指示其执行。虽然已经有现成的可供使用的描述符,但是它们只能满足一些常见的程序集要求。所以为了让你自定义程序集插件创建程序集,你需要知道如何使用程序集描述符。
- Maven的Assembly Plugin使开发人员能够将项目输出组合到一个可分发的归档文件中,该归档文件还包含依赖项、模块、站点文档和其他文件。
- 示例:此描述符指定要创建的程序集存档的类型、程序集的内容以及依赖项或其模块与程序集绑定的方式。
<!-- 程序集定义从项目生成的文件集合,通常以zip、tar或tar.gz等归档格式分发。例如,项目可以生成一个ZIP程序集,其中根目录中包含项目的JAR工件,lib/目录中包含运行时依赖项,以及启动独立应用程序的shell脚本。 -->
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.1 https://maven.apache.org/xsd/assembly-2.1.1.xsd">
<!-- 设置程序集的id,项目的特定文件程序集的符号名称。此外,除了通过将其值附加到生成的归档文件来明确地命名组装的包之外,该id在部署时还用作工件的分类器。 -->
<id/>
<!-- 指定程序集的格式。通过goal参数指定格式通常比在这里指定格式更好。可以提供多种格式,Assembly Plugin将为每一种所需格式生成一个存档。格式通过添加<format>子元素指定值来完成。例如zip创建一个zip文件格式,tar创建一个tar格式,tar.gz创建一个gzip的tar格式,jar创建一个jar格式,dir创建一个分离的目录格式,war创建一个war格式等。 -->
<formats>
<format>tar.gz</format>
<format>dir</format>
</formats>
<!-- 在最终存档中包含一个基本目录。默认值是true。如果你正在创建一个名为“your-app”的程序集,将includeBaseDirectory设置为true将创建一个包含这个基本目录的归档文件。如果此选项设置为false,则创建的归档文件将解压缩其内容到当前目录。 -->
<includeBaseDirectory>false</includeBaseDirectory>
<!-- 设置生成程序集存档的基本目录。如果没有设置并且includeBaseDirectory为true,${project.build.finalName}会被替代。 -->
<baseDirectory/>
<!-- 在最终存档中包含一个站点目录。项目的站点目录位置由程序集插件的siteDirectory参数确定。 -->
<includeSiteDirectory/>
<!-- 从常规归档流中过滤各种容器描述符的组件集,这样它们就可以聚合然后添加。 -->
<containerDescriptorHandlers>
<!-- 为进入程序集存档的文件配置一个过滤器,以允许聚合各种类型的描述符片段,例如components.xml、web.xml等。 -->
<containerDescriptorHandler>
<!-- 处理程序的丛角色提示,用于从容器中查找。 -->
<handlerName/>
<!-- 处理器的配置选项。 -->
<configuration/>
</containerDescriptorHandler>
</containerDescriptorHandlers>
<!-- 指定包含在程序集中的模块文件。 -->
<moduleSets>
<!-- 代表项目的pom.xml中的<module>元素。当从命令行使用<moduleSets>时,需要先通过执行:"mvn package assembly:assembly"来传递包阶段。这个错误/问题计划由Maven 2.1解决。 -->
<moduleSet>
<!-- 如果设置为true,插件将包括当前反应堆中的所有项目,以便在此ModuleSet中处理。这些将受包含/排除规则的约束。默认值是false。 -->
<useAllReactorProjects/>
<!-- 如果设置为false,插件将排除这个模块集中的子模块。否则,它将处理所有子模块,每个主题包含/排除规则。 -->
<includeSubModules/>
<!-- 当<include>子元素出现时,它们定义了一组要包含的项目坐标。如果没有,则<includes>表示所有有效值。工件坐标可以以简单的groupId:artifactId形式给出,也可以以groupId:artifactId:type[:classifier]:version形式完全限定。此外还可以使用通配符。 -->
<includes/>
<!-- 类似includes。 -->
<excludes/>
<!-- 包含用于在程序集中包含项目模块的源文件的配置选项。 -->
<sources>
<!-- 在计算受此集影响的文件时,是否应该使用标准排除模式,如匹配CVS和Subversion元数据文件。对于向后兼容性,默认值是正确的。 -->
<useDefaultExcludes/>
<!-- 将输出目录设置为组件根目录的根。例如,“日志”将指定文件放在日志目录中。 -->
<outputDirectory/>
<includes/>
<excludes/>
<!-- 类似unix权限,设置包含的文件模式,是一个8进制值。(User)(Group)(other) -->
<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允许将文件组包含到程序集中。 -->
<fileSet>
<useDefaultExcludes/>
<!-- 设置输出目录相对于程序集根目录的根目录。 -->
<outputDirectory/>
<includes/>
<excludes/>
<fileMode/>
<directoryMode/>
<!-- 设置模块目录中的绝对或相对位置。 -->
<directory/>
<lineEnding/>
<filtered/>
<nonFilteredFileExtensions/>
</fileSet>
</fileSets>
<!-- 指定包含在程序集中的单个文件。 -->
<files>
<file>
<source/>
<sources/>
<outputDirectory/>
<destName/>
<fileMode/>
<lineEnding/>
<filtered/>
</file>
</files>
<!-- 指定在程序集中包含的依赖。 -->
<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>
<!-- 自2.1.1版本后废弃了,指定在程序集中包含的存储库文件。 -->
<repositories>
<repository>
<outputDirectory/>
<includes/>
<excludes/>
<fileMode/>
<directoryMode/>
<includeMetadata/>
<groupVersionAlignments>
<groupVersionAlignment>
<id/>
<version/>
<excludes/>
</groupVersionAlignment>
</groupVersionAlignments>
<scope/>
</repository>
</repositories>
<!-- 指定要包含在程序集中的共享组件xml文件位置。 -->
<componentDescriptors/>
</assembly>
- 预定义描述符
- 有四种预定义的描述符格式可供重用,打包在Assembly Plugin中。它们的描述id是:
(1)bin
- 引入maven-assembly-plugin时,在
<configuration>
中配置<descriptorRef>
为bin
以创建项目的二进制发行存档。
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.1 https://maven.apache.org/xsd/assembly-2.1.1.xsd">
<id>bin</id>
<formats>
<format>tar.gz</format>
<format>tar.bz2</format>
<format>zip</format>
</formats>
<fileSets>
<fileSet>
<directory>${project.basedir}</directory>
<outputDirectory></outputDirectory>
<includes>
<include>README*</include>
<include>LICENSE*</include>
<include>NOTICE*</include>
</includes>
</fileSet>
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory></outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
<fileSet>
<directory>${project.build.directory}/site</directory>
<outputDirectory>docs</outputDirectory>
</fileSet>
</fileSets>
</assembly>
(2)jar-with-dependencies
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.1 https://maven.apache.org/xsd/assembly-2.1.1.xsd">
<!-- TODO: a jarjar format would be better -->
<id>jar-with-dependencies</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<outputDirectory>/</outputDirectory>
<useProjectArtifact>true</useProjectArtifact>
<unpack>true</unpack>
<scope>runtime</scope>
</dependencySet>
</dependencySets>
</assembly>
(3)src
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.1 https://maven.apache.org/xsd/assembly-2.1.1.xsd">
<id>src</id>
<formats>
<format>tar.gz</format>
<format>tar.bz2</format>
<format>zip</format>
</formats>
<fileSets>
<fileSet>
<directory>${project.basedir}</directory>
<includes>
<include>README*</include>
<include>LICENSE*</include>
<include>NOTICE*</include>
<include>pom.xml</include>
</includes>
<useDefaultExcludes>true</useDefaultExcludes>
</fileSet>
<fileSet>
<directory>${project.basedir}/src</directory>
<useDefaultExcludes>true</useDefaultExcludes>
</fileSet>
</fileSets>
</assembly>
(4)project
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.1 https://maven.apache.org/xsd/assembly-2.1.1.xsd">
<id>project</id>
<formats>
<format>tar.gz</format>
<format>tar.bz2</format>
<format>zip</format>
</formats>
<fileSets>
<fileSet>
<directory>${project.basedir}</directory>
<outputDirectory></outputDirectory>
<useDefaultExcludes>true</useDefaultExcludes>
<excludes>
<exclude>**/*.log</exclude>
<exclude>**/${project.build.directory}/**</exclude>
</excludes>
</fileSet>
</fileSets>
</assembly>
- 创建一个可执行JAR
<project>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.4.2</version>
<configuration>
<archive>
<manifest>
<mainClass>org.sample.App</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
- 在pom.xml中指定自定义的配置
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<finalName>data</finalName>
<descriptors>
<!-- 自定义配置 -->
<descriptor>package.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>