maven-assembly-plugin的使用

  1. 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>
  1. 预定义描述符
  • 有四种预定义的描述符格式可供重用,打包在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>
  1. 创建一个可执行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>
  1. 在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>