如何使用 maven 创建一个修补的 jar(具有相同的 group:artifact:version,但不同的分类器)?

How to create a patched jar with maven (with the same group:artifact:version, but different classifier)?

我有一些理由要修补现有的 jar(原因相当不相关)。我正在尝试使用相同的 group:artifactid:version 创建一个 jar,但使用不同的分类器。我的尝试pom.xml如下。

Maven 对两件事感到不安 -- 1) 它无法识别项目中的 <classifier>(带注释的行),以及 2) 它认为底部的引用是循环的(因为分类器部分被忽略,所以这是一个次要错误)。

处理这种情况的正确方法是什么?

(我删除了插件,但基本上它们是依赖副本并执​​行 shell 脚本——简单但笨重且无关紧要。)

<?xml version="1.0" encoding="UTF-8"?>
<project ...>
  <modelVersion>4.0.0</modelVersion>

  <name>Patched TestNG</name>

  <groupId>org.testng</groupId>
  <artifactId>testng</artifactId>
  <version>6.13.1</version>
  <classifier>patched</classifier> <!-- this is the first offending line -->
  <packaging>jar</packaging>

  <build>...</build>
  <dependencies>
    <dependency> <!-- treated as a self-reference -->
      <groupId>org.testng</groupId>
      <artifactId>testng</artifactId>
      <version>6.13.1</version>
    </dependency>
  </dependencies>
</project>

错误:

[ERROR] The project org.testng:testng:6.13.1 (.../testng-patched/pom.xml) has 2 errors [ERROR] Malformed POM .../testng-patched/pom.xml: Unrecognised tag: 'classifier' (position: START_TAG seen ...\n ... @12:15) @ .../testng-patched/pom.xml, line 12, column 15 -> [Help 2] [ERROR]
'dependencies.dependency org.testng:testng:6.13.1' for org.testng:testng:6.13.1 is referencing itself. @ line 71, column 17

您要求正确的处理方式。以我的愚见:不要尝试自我引用 jar,而是转到源代码,进行您想要的更改,然后使用版本号 6.13.1-patched.

构建工件

如果你真的想要添加一个具有相同 GAV 但不同分类器的 jar,你需要绕过 Maven(这本身通常是一种罪过)。我最好的想法是:

  1. 删除<classifier>。此标签不存在。
  2. <artifactId> 重命名为不同的名称,例如 dummy
  3. 使用 clean package 构建工件。
  4. 现在使用 deploy:deploy-file 和适当的参数将具有正确 GAV 和分类器的 dummy 工件部署到存储库。

最后一点很棘手,可能行不通。请注意,您正在尝试部署没有 POM 的工件(因为原始工件的 POM 已经存在),这可能有效也可能无效。