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

2024-04-01

我在构建 Maven 项目时遇到问题。我有一个生产要求确定性的jar 文件,这些文件在不同的构建和版本之间必须是二进制一致的,以防这些构建之间没有源代码更改。为此,我使用了本文 http://gary-rowe.com/agilestack/2013/08/08/how-to-create-a-deterministic-jar/以获得指导。

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

  <plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.7</version>
    <executions>
      <execution>
        <id>step-1-remove-timestamp</id>
        <phase>prepare-package</phase>
        <configuration>
          <target>
            <touch datetime="01/01/2015 00:10:00 am">
              <fileset dir="target/classes"/>
              <fileset dir="src"/>
            </touch>
          </target>
        </configuration>
        <goals>
          <goal>run</goal>
        </goals>
      </execution>
      <execution>
        <id>step-3-rename-assembly</id>
        <phase>package</phase>
        <configuration>
          <target>
            <copy file="${project.build.directory}/${project.build.finalName}-deterministic.zip"
                  tofile="${project.build.directory}/${project.build.finalName}.jar"/>
          </target>
        </configuration>
        <goals>
          <goal>run</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

  <plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2.1</version>
    <configuration>
      <descriptors>
        <descriptor>src/main/assembly/zip.xml</descriptor>
      </descriptors>
    </configuration>
    <executions>
      <execution>
        <id>step-2-make-assembly</id>
        <phase>prepare-package</phase>
        <goals>
          <goal>single</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

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

所以,我已经禁用了maven-jar-plugin执行,通过显式地将其设置为在无效阶段运行,如下所示:(从其他帖子在这里 https://stackoverflow.com/questions/4101750/disable-the-execution-default-jar)

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.5</version>
    <executions>
      <execution>
        <id>default-jar</id>
        <phase>never</phase>
        <configuration>
          <finalName>unwanted</finalName>
          <classifier>unwanted</classifier>
        </configuration>
      </execution>
    </executions>
  </plugin>

一切看起来都很好,直到我发现我的主要 jar 工件从未安装在.m2目录。为了纠正这个问题,我还添加了maven-helper-plugin这样我就可以手动附加从汇编器插件生成的任何工件:

  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <version>1.9.1</version>
    <executions>
      <execution>
        <id>attach-instrumented-jar</id>
        <phase>verify</phase>
        <goals>
          <goal>attach-artifact</goal>
        </goals>
        <configuration>
          <artifacts>
            <artifact>
              <file>${project.build.directory}/${project.build.finalName}.jar</file>
              <type>jar</type>
            </artifact>
          </artifacts>
        </configuration>
      </execution>
    </executions>
  </plugin>

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

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

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


经过更多的尝试和失败后,我碰巧找到了一个可行的解决方案。 我将其发布在这里,希望有用,或者有任何问题可以向我指出,因为我不太有信心这是否是一种可靠的方法。

所以,我收到的错误

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

对我来说意味着我无法“再次”手动安装主要工件。由于该神器不再由maven-jar-plugin,即使文件存在,它也永远不会被安排安装(antrun复制任务会生成一个同名的jar)。

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

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

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <version>2.5</version>
      <executions>
        <execution>
          <id>default-jar</id>
          <phase>package</phase>
        </execution>
      </executions>
    </plugin>
    

    这将在package阶段,最重要的是,让 Maven 知道它要在阶段安装install phase.

  2. 调整maven-antrun-plugin将任务复制到覆盖已经生成的具有确定性拉链的罐子。设置与我的问题几乎相同,因此我仅添加差异:

    <plugin>
      <artifactId>maven-antrun-plugin</artifactId>
      <version>1.7</version>
      <executions>
        <execution>...</execution>
        <execution>
          <id>step-3-rename-assembly-and-sources</id>
          <phase>package</phase>
          <configuration>
            <target>
              <copy file="${project.build.directory}/${project.build.finalName}-deterministic.zip"
                    tofile="${project.build.directory}/${project.build.finalName}.jar"
                    overwrite="true"/>
            </target>
          </configuration>
        </execution>
          . . .
      </executions>
    </plugin>
    

    复制操作现在有overwrite="true"指定的。最初,复制操作似乎会忽略目标中已存在的文件,而发生的情况是maven-jar-plugin当复制发生时已经生成了默认的 jar 工件。设置此选项后,maven-antrun-plugin现在用确定性的 jar 覆盖前一个 jar,而后者成为 Maven 的主题install phase.

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


            <artifact>
              <file>${project.build.directory}/${project.build.finalName}.jar</file>
              <type>jar</type>
            </artifact>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果由 maven-assemble-plugin 构建,则手动附加主要工件 的相关文章

  • 日期语句之间的 JPQL SELECT [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我想将此 SQL 语句转换为等效的 JPQL SELECT FROM events WHERE events date BETWE
  • Junit:如何测试从属性文件读取属性的方法

    嗨 我有课ReadProperty其中有一个方法ReadPropertyFile返回类型的Myclass从属性文件读取参数值并返回Myclass目的 我需要帮助来测试ReadPropertyFile方法与JUnit 如果可能的话使用模拟文件
  • 如何通过 javaconfig 使用 SchedulerFactoryBean.schedulerContextAsMap

    我使用 Spring 4 0 并将项目从 xml 移至 java config 除了访问 Service scheduleService 带注释的类来自QuartzJobBean executeInternal 我必须让它工作的 xml 位
  • Java 枚举与创建位掩码和检查权限的混淆

    我想将此 c 权限模块移植到 java 但是当我无法将数值保存在数据库中然后将其转换为枚举表示形式时 我很困惑如何执行此操作 在 C 中 我创建一个如下所示的枚举 public enum ArticlePermission CanRead
  • 使用 LinkedList 实现下一个和上一个按钮

    这可能是一个愚蠢的问题 但我很难思考清楚 我编写了一个使用 LinkedList 来移动加载的 MIDI 乐器的方法 我想制作一个下一个和一个上一个按钮 以便每次单击该按钮时都会遍历 LinkedList 如果我硬编码itr next or
  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • 在 Jar 文件中运行 ANT build.xml 文件

    我需要使用存储在 jar 文件中的 build xml 文件运行 ANT 构建 该 jar 文件在类路径中可用 是否可以在不分解 jar 文件并将 build xml 保存到本地目录的情况下做到这一点 如果是的话我该怎么办呢 Update
  • 从最终实体获取根证书和中间证书

    作为密码学的菜鸟 我每天都会偶然发现一些简单的事情 今天只是那些日子之一 我想用 bouncy castle 库验证 java 中的 smime 消息 我想我几乎已经弄清楚了 但此时的问题是 PKIXparameters 对象的构建 假设我
  • 在 junit 测试中获取 javax.lang.model.element.Element 类

    我想测试我的实用程序类 ElementUtils 但我不知道如何将类作为元素获取 在 AnnotationProcessors 中 我使用以下代码获取元素 Set
  • Spring Boot Data JPA 从存储过程接收多个输出参数

    我尝试通过 Spring Boot Data JPA v2 2 6 调用具有多个输出参数的存储过程 但收到错误 DEBUG http nio 8080 exec 1 org hibernate engine jdbc spi SqlStat
  • 当 OnFocusChangeListener 应用于包装的 EditText 时,TextInputLayout 没有动画

    不能比标题说得更清楚了 我有一个由文本输入布局包裹的 EditText 我试图在 EditText 失去焦点时触发一个事件 但是 一旦应用了事件侦听器 TextInputLayout 就不再对文本进行动画处理 它只是位于 editText
  • tomcat 中受密码保护的应用程序

    我正在使用 JSP Servlet 开发一个Web应用程序 并且我使用了Tomcat 7 0 33 as a web container 所以我的要求是tomcat中的每个应用程序都会password像受保护的manager applica
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • java for windows 中的文件图标叠加

    我正在尝试像 Tortoise SVN 或 Dropbox 一样在文件和文件夹上实现图标叠加 我在网上查了很多资料 但没有找到Java的解决方案 Can anyone help me with this 很抱歉确认您的担忧 但这无法在 Ja
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是

随机推荐