maven-assembly-plugin:如何使用 appendAssemblyId

2022-09-01 03:09:06

我有一个多模块Maven项目,在一个模块中,我想在构建期间创建两个工件:

  • 主要工件是其他一些模块将依赖的jar库。
  • 执行某些帮助程序函数的可执行 jar 文件。没有其他模块依赖于此,它仅用于用户在某些情况下手动运行它。

以下是我用来配置插件的代码:maven-assembly-plugin

<plugin>
    <artifactId>
        maven-assembly-plugin
    </artifactId>
    <version>2.4</version>
    <executions>
      <execution>
        <id>dist-assembly</id>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>

        <configuration>
          <finalName>bso</finalName>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
          <finalName>helper-${project.version}</finalName>
          <appendAssemblyId>false</appendAssemblyId>
          <archive>
            <manifest>
              <mainClass>HelperMain<mainClass>
            </manifest>
          </archive>
        </configuration>

      </execution>
    </executions>
  </plugin>

我正在设置,因为否则将被附加到最终名称,我认为不需要它。省略它可以获得更清晰,更易于使用的文件名。appendAssemblyIdfalse-jar-with-dependencies

当我运行时,我收到以下警告:mvn integration-test

[警告]配置选项:“appendAssemblyId”设置为 false,并且缺少“分类器”。而不是附加程序集文件:[...]/target/helper-5.0.0-SNAPSHOT.jar,它将成为主项目工件的文件。

注意:如果为此项目提供了多个描述符或描述符格式,则此文件的值将是非确定性的!

[警告]替换预先存在的项目主工件文件:[...]/target/my.module-5.0.0-SNAPSHOT.jar程序集文件:[...]/target/helper-5.0.0-SNAPSHOT.jar

有两件事让我很恼火:

  1. 尽管警告声称它将用helper-5.0.0-SNAPSHOT替换my.module-5.0.0-SNAPSHOT.jar.jar但它实际上并没有这样做,并且当构建完成后,两个文件仍然具有不同的大小。

  2. 为什么会出现有关替换工件的警告?

  3. 似乎已被弃用,为什么警告要求我使用它?classifier


答案 1

那是因为你误解了警告。


让我们回顾一下。默认情况下,非类型的 Maven 项目将始终生成所谓的主工件。对于 JAR,此工件是将编译的源代码打包到 JAR 中的结果。对于 WAR,它是构建 Web 应用程序的结果。pom

重要的是要记住,此工件已附加到项目中:当安装(使用)、部署(使用)或发布(使用 )项目时,此术语很有用。附加意味着在项目启动时将安装/部署/发布此工件。并非所有在Maven构建期间生成的文件(基本上,文件夹下的所有内容)都是;仅附加的文件。因此,您可以很好地在下面创建许多文件,但只有一个安装的项目。mvn installmvn deploymaven-release-plugintargettarget

除了此主要项目之外,你可能还希望生成其他项目来安装或部署。这是附加或辅助附加工件的概念。主要的例子是Javadoc或源代码:通常当一个项目发布时,它的Javadoc和它的源代码也是。这就是概念分类器发挥作用的地方。

在 Maven 存储库中,每个文件都必须遵循相同的命名约定:。每个辅助工件都将具有与主工件相同的GAV(组ID,工件ID,版本),因此,如果要放入Maven存储库1主工件和1附加工件中(就像主JAR及其JAR Javadoc和JAR源的情况一样),您需要一些方法来区分它们。这就是它的用途:将次要工件与主要工件区分开来。artifactId-version(-classifier).typeclassifier


现在让我们回到您的示例。您的 Maven 项目(打包)将默认生成一个名为 ;默认情况下,此主 JAR 仍附加到项目(并准备安装/部署)。现在,您正在配置 以创建新的 JAR 工件(称为,但实际上并不重要)。默认情况下,程序集插件将它生成的工件附加到项目中。所以你最终会得到2个附加的工件jarmy.module-5.0.0-SNAPSHOT.jarmaven-assembly-pluginhelper-5.0.0-SNAPSHOT.jar

  1. 具有相同的工件 ID ;文件夹内磁盘上的文件以一个命名的事实是无关紧要的,只有GAV坐标很重要my.moduletargethelper
  2. 具有相同版本的5.0.0-SNAPSHOT
  3. 具有与 JAR 相同的包装

并且没有分类器来区分它们。这就是引发警告的原因:您最终会将一个辅助工件附加到项目中,该工件有效地取代了主工件,仅仅是因为它具有相同的坐标。所以结果是:

  1. 两个文件在磁盘内部具有不同的名称,但这无关紧要,因为target
  2. 两者共享相同的坐标,因此只有1个可以存活。

它是由组装插件生成的,它将赢得冲突,并替换附加的主工件。

如果你想说服自己所有这些,请在项目上运行并检查本地存储库。您会注意到,将仅安装工件。另一个(主要神器)噗噗噗噗mvn clean installjar-with-dependencies

您还可以配置:<distributionManagement>

<distributionManagement>
    <repository>
        <id>local-repo-test</id>
        <url>file://...</url>
    </repository>
</distributionManagement>

并调用 .然后,您可以检查唯一部署的项目是否为 .mvn clean deployjar-with-dependencies


最后注意:是的,程序集插件的分类器参数已弃用,因为您应该只使用程序集 id 作为分类器。


答案 2

推荐