代码之家  ›  专栏  ›  技术社区  ›  lanoxx

maven程序集插件:如何使用appendAssemblyId

  •  40
  • lanoxx  · 技术社区  · 8 年前

    我有一个多模块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. 尽管警告声称它将取代my.module-5.0.0-SNAPSHOT。带有助手-5.0.0-SNAPSHOT的罐子。jar实际上并没有这样做,当构建完成时,两个文件的大小仍然不同。

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

    3. 看来 classifier

    1 回复  |  直到 8 年前
        1
  •  65
  •   Community Egal    7 年前

    那是因为你误解了警告。


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

    重要的是要记住,这个工件 附属的 对于项目:当项目安装(带有 mvn install ),已部署(使用 mvn deploy )或发布(使用 maven-release-plugin ). 附属的 这意味着该工件将在项目完成时安装/部署/发布 target 目标

    the notion classifier kicks in .

    在Maven存储库中,每个文件都必须遵循相同的命名约定: artifactId-version(-classifier).type 。每个次要工件都将具有与主工件相同的GAV(组id、工件id、版本),因此如果您想放入Maven repo 1主工件和1个附加工件(就像主JAR及其JAR Javadoc和JAR源一样),您需要某种方法来区分它们。这就是 分类器


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

    1. my.module ; 磁盘上的文件位于 目标 文件夹已命名 helper 一个是无关紧要的,只有GAV坐标才重要
    2. 具有相同版本的 5.0.0-SNAPSHOT
    3. 与JAR包装相同

    没有分类器来区分它们。这就是提出警告的原因:您最终会将一个有效替代主工件的辅助工件附加到项目中,这仅仅是因为它具有相同的坐标。因此,结果是:

    1. 两个文件在内部磁盘上具有不同的名称 目标 ,但这无关紧要,因为

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

    如果你想说服自己,跑吧 mvn clean install 并检查您的本地回购。您会注意到,只有 jar-with-dependencies 将安装工件。另一个(主要的人工制品)变得很糟糕。

    您还可以配置 <distributionManagement> :

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

    并调用 mvn clean deploy 。然后您可以检查唯一部署的工件是否是 .


    最后说明:是的 classifier Assembly Plugin的参数已弃用,因为您应该只使用程序集id作为分类器。