maven-assembly-plugin:如何使用appendAssemblyId

时间:2016-07-20 13:34:51

标签: java maven maven-assembly-plugin

我有一个多模块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>

我将appendAssemblyId设置为false,否则-jar-with-dependencies将附加到最终名称,我认为不需要它。省略它可以提供更清晰,更易于使用的文件名。

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

  

[警告]配置选项:'appendAssemblyId'设置为false,并且缺少'classifier'。   而不是附加程序集文件:[...] / 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.jar替换my.module-5.0.0-SNAPSHOT.jar,但它实际上并没有这样做,并且当构建完成时文件仍有不同的大小。

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

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

1 个答案:

答案 0 :(得分:31)

那是因为你错误地解释了这些警告。

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

重要的是要记住,此工件是附加到项目中:当项目安装(使用mvn install),部署时(mvn deploy,此术语非常有用})或已发布(使用maven-release-plugin)。 附加表示在项目实施时将安装/部署/发布此工件。并非Maven构建期间生成的所有文件(基本上,target文件夹下的所有文件)都是;只有附加的文件。因此,您可以在target下创建大量文件,但只有一个已安装的工件。

除了这个主要工件外,您可能希望构建生成其他工件以进行安装或部署。这是附加或辅助附加工件的概念。主要的例子是Javadoc或源代码:通常在项目发布时,其Javadoc及其来源也是如此。那就是the notion classifier kicks in

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

现在让我们回到你的例子。您的Maven项目采用jar打包,默认情况下会生成一个名为my.module-5.0.0-SNAPSHOT.jar的主要JAR工件;仍然默认情况下,此主JAR附加到项目(并准备安装/部署)。现在,您正在配置maven-assembly-plugin以创建新的JAR工件(称为helper-5.0.0-SNAPSHOT.jar,但它确实无关紧要)。默认情况下,程序集插件attaches to the project the artifact it produces。所以你最终得到了2个附加的工件

  1. 具有相同的工件ID my.module; target文件夹中的磁盘上的文件被命名为helper的事实是无关紧要的,只有GAV坐标很重要
  2. 拥有相同版本的5.0.0-SNAPSHOT
  3. 具有相同的JAR包装
  4. 并没有分类来区分它们。这就是提出警告的原因:你最终会在项目中附加一个有效替换主要工件的辅助工件,因为它具有相同的坐标。结果是:

    1. 两个文件在target内的磁盘上具有不同的名称,但这是无关紧要的,因为
    2. 两者共享相同的坐标,因此只有1个存活。
    3. 它是由Assembly Plugin生成的,它将赢得冲突,并替换附加的主要工件。

      如果您想说服自己,请在项目上运行mvn clean install并检查您当地的回购。您会注意到只会安装jar-with-dependencies工件。另一个(主要的神器)走了。

      您还可以配置<distributionManagement>

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

      并调用mvn clean deploy。然后,您可以检查唯一部署的工件是jar-with-dependencies

      最后注意:是的,不推荐使用Assembly Plugin的classifier参数,因为您应该只使用程序集ID作为分类器。