如何使用 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(这本身通常是一种罪过)。我最好的想法是:
- 删除
<classifier>
。此标签不存在。
- 将
<artifactId>
重命名为不同的名称,例如 dummy
。
- 使用
clean package
构建工件。
- 现在使用
deploy:deploy-file
和适当的参数将具有正确 GAV 和分类器的 dummy
工件部署到存储库。
最后一点很棘手,可能行不通。请注意,您正在尝试部署没有 POM 的工件(因为原始工件的 POM 已经存在),这可能有效也可能无效。
我有一些理由要修补现有的 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(这本身通常是一种罪过)。我最好的想法是:
- 删除
<classifier>
。此标签不存在。 - 将
<artifactId>
重命名为不同的名称,例如dummy
。 - 使用
clean package
构建工件。 - 现在使用
deploy:deploy-file
和适当的参数将具有正确 GAV 和分类器的dummy
工件部署到存储库。
最后一点很棘手,可能行不通。请注意,您正在尝试部署没有 POM 的工件(因为原始工件的 POM 已经存在),这可能有效也可能无效。