如果由maven-assembly-plugin构建,则手动附加主工件

我在构建maven项目时遇到了问题。 我需要生成确定性 jar文件,如果这些版本之间没有源代码更改,则必须在不同版本和版本之间保持二进制一致。 为此,我使用本文作为指导。

我已经成功地建立了我的jar子,它们符合我的要求。 这是我的配置:

 maven-antrun-plugin 1.7   step-1-remove-timestamp prepare-package          run    step-3-rename-assembly package       run      maven-assembly-plugin 2.2.1   src/main/assembly/zip.xml     step-2-make-assembly prepare-package  single     

在上面的代码中,我将jar构建并打包为zip,然后将zip复制到预期的jar工件上。
上面的问题是,maven仍然执行maven-jar-plugin ,因此手动组装的jar被maven-jar-plugin之一覆盖。 我不想使用这个jar,因为它不符合我的要求。

所以,我已经禁用了maven-jar-plugin执行,通过明确地将其设置为无效阶段运行,如下所示:(从这里看到其他post )

   org.apache.maven.plugins maven-jar-plugin 2.5   default-jar never  unwanted unwanted     

一切似乎都很好,直到我发现我的主jar工件永远不会安装在.m2目录中。 为了解决这个问题,我还添加了maven-helper-plugin以便我手动附加我从汇编程序插件生成的任何工件:

   org.codehaus.mojo build-helper-maven-plugin 1.9.1   attach-instrumented-jar verify  attach-artifact     ${project.build.directory}/${project.build.finalName}.jar jar       

这导致我无法解决的错误:

[错误]无法在项目my-project上执行目标org.codehaus.mojo:build-helper-maven-plugin:1.9.1:attach-artifact(attach-instrumented-jar):执行attach-instrumented-jar of goal org .codehaus.mojo:build-helper-maven-plugin:1.9.1:attach-artifact failed:对于工件{full-name-of-my-project.jar}: 附加的工件必须具有与其对应的main不同的ID神器。 – > [帮助1]

有没有办法克服这个问题? 我已经检查了解决方案,并且大多数建议使用分类器,但我想安装主要工件,就像maven-jar-plugin 。 我们正在开发的其他软件将需要标准的jar依赖,我们希望通过不合理地引入分类器来避免使我们的设置复杂化。

经过一些试验和失败后,我碰巧找到了一个有效的解决方案。 我在这里发布它的希望是有用的,或者有任何问题指向我,因为我不确定这是否是一个可靠的方法。

所以,我收到的错误

附加工件必须具有与其对应的主工件不同的ID。

意味着我无法手动安装“再次”主要工件。 由于maven-jar-plugin不再生成该工件,因此即使存在该文件,也永远不会安排安装(antrun复制任务会生成具有相同名称的jar)。

令人惊讶的是,它需要一些小技巧才能再次使用它:

  1. 重新启用maven-jar-plugin应该是:

      org.apache.maven.plugins maven-jar-plugin 2.5   default-jar package    

    这将在package阶段产生标准jar,最重要的是,使maven知道在install阶段安装它。

  2. 调整maven-antrun-plugin复制任务,用确定性zip压缩已经生成的jar。 设置几乎与我的问题相同,所以我只是添加了差异:

      maven-antrun-plugin 1.7  ...  step-3-rename-assembly-and-sources package       . . .   

    复制操作现在指定了overwrite="true" 。 最初,复制操作似乎忽略了目标中的文件(如果它们已经存在),并且发生的事情是maven-jar-plugin在复制时已经产生了默认的jar工件。 设置此选项后, maven-antrun-plugin现在会使用确定的jar重写前jar,后者成为maven install阶段的主题。

  3. 从build-helper-maven-plugin中删除了设置,以便第二次不复制主jar工件:

 ${project.build.directory}/${project.build.finalName}.jar jar 
 ${project.build.directory}/${project.build.finalName}.jar jar  

就是这样,正确的jar安装在.m2目录中。