用法

要处理过滤此版本的 Maven 程序集插件,请使用Maven Filtering 3.1.1。

要处理存档此版本的 Maven 程序集插件,请使用Maven Archiver 3.5.0。

本文档旨在提供使用 maven-assembly-plugin 的说明。为了使这个讨论有用,涵盖两个主题至关重要:插件的配置 - 在 POM 中,并且在可能的情况下,从命令行 - 以及不同的执行方式。为了清楚起见,我们将在执行之前介绍配置。

配置

开始使用 Assembly 插件非常简单。如果要使用预制的程序集描述符之一,请使用 < descriptorRefs> /< descriptorRef>参数配置要使用的描述符。如果要使用自定义程序集描述符,请使用 < descriptor> /< descriptor>参数配置描述符的路径。

请注意,Assembly Plugin 的一次调用实际上可以从多个描述符生成程序集,从而使您能够最大程度地灵活地自定义项目生成的二进制文件套件。创建程序集时,它将使用 assemblyId 作为工件的分类器,并将创建的程序集附加到项目中,以便在安装和部署阶段将其上传到存储库中。

例如,假设我们的项目生成了一个 JAR。如果我们想创建一个包含项目依赖项的程序集二进制文件,我们可以利用程序集插件的预制描述符之一。您在项目的pom.xml中对其进行如下配置:

<project>
  [...]
  <build>
    [...]
    <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.3.0</version>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
        [...]
</project>

请注意,Assembly Plugin 允许您一次指定多个descriptorRefs,以在一次调用中生成多种类型的程序集。

或者,我们在src/assembly目录中创建了一个名为src.xml的自定义程序集描述符(有关更多信息,请参阅参考资料部分)。我们可以告诉 Assembly Plugin 使用它:

<project>
  [...]
  <build>
    [...]
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.3.0</version>
        <configuration>
          <descriptors>
            <descriptor>src/assembly/src.xml</descriptor>
          </descriptors>
        </configuration>
        [...]
</project>

再次注意,我们可以在此处指定多个自定义程序集描述符。此外,可以在同一配置中指定描述符descriptorRefs的混合。

注意:许多其他配置选项可用于组装插件中的各种目标。有关更多信息,请参阅示例部分插件参数文档

执行:构建程序集

一旦为您希望项目生成的程序集配置了各种描述符descriptorRefs ,就可以构建它们了。

在大多数情况下,您需要确保您的程序集是作为正常构建过程的一部分创建的。这确保了程序集存档可用于安装和部署,并且它们是在项目发布期间创建的。这是由程序集处理的:单一目标。

要将单个目标绑定到项目的构建生命周期,您可以添加此配置(假设您使用的是jar-with-dependencies预制描述符):

<project>
  [...]
  <build>
    [...]
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.3.0</version>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
        <executions>
          <execution>
            <id>make-assembly</id> <!-- this is used for inheritance merges -->
            <phase>package</phase> <!-- bind to the packaging phase -->
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      [...]
</project>

然后,要创建项目程序集,只需从默认生命周期执行正常的包阶段:

mvn package

此构建完成后,您应该会在目标目录中看到一个文件,其名称类似于以下内容:

target/sample-1.0-SNAPSHOT-jar-with-dependencies.jar

注意工件分类器,在版本结尾和文件扩展名开头之间,jar-with-dependencies。这是用于创建此工件的程序集描述符的ID 。

明白了!

在大多数情况下,单个目标应该绑定到构建的打包阶段。但是,如果您的程序集不需要二进制文件,或者如果您需要使用一个程序集作为另一个程序集的输入,则可能需要更改此设置。虽然可以将单一目标分配给构建生命周期的任何阶段,但您应该小心确保程序集中包含的资源在创建该程序集之前存在。

高级配置

创建可执行 JAR

正如您毫无疑问地注意到的那样,Assembly Plugin 是一种非常有用的方式,可以为您的项目创建一个自包含的二进制工件,等等。但是,一旦您创建了这个独立的 JAR,您可能希望能够使用-jar JVM 开关来执行它。

为了适应这一点,Assembly Plugin 支持配置<archive>元素,该元素由maven-archiver处理(请参阅参考资料)。使用此配置,很容易配置JAR 清单的Main-Class属性:

<project>
  [...]
  <build>
    [...]
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.3.0</version>
        <configuration>
          [...]
          <archive>
            <manifest>
              <mainClass>org.sample.App</mainClass>
            </manifest>
          </archive>
        </configuration>
        [...]
      </plugin>
      [...]
</project>

如果我们将此配置添加到上面的目标示例并重新构建,我们将在生成的 JAR的META-INF/MANIFEST.MF文件中看到类似这样的条目:

[...]
Main-Class: org.sample.App

有关 Assembly Plugin 的高级配置的更多信息,请参阅参考资料部分。

明白了!

此时,只有jarwar程序集格式支持<archive>配置元素。

资源

  1. 有关编写自己的程序集描述符的更多信息,请阅读程序集描述
  2. 有关maven-archiver的更多信息,请查看此处
  3. 有关高级maven-assembly-plugin配置的更多信息,请参阅示例