问题描述
我已经为此苦苦挣扎了一段时间。
背景:我们有一些 Jenkins 作业会生成 jars 和其他将 jars 上传到 nexus 的作业。在我们的例子中,我们正在寻找 myJar-1.0.jar
和 myJar-1.0-myClassifier.jar
。显然,它们都是用同一个 pom.xml
文件生成的。
我想要实现的是使用 pom.xml
通过 REST API 和 curl 命令将它们都上传到 Nexus(我们使用 Nexus2)。
pom.xml
文件如下所示:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>my.group.id</groupId>
<artifactId>myJar</artifactId>
<version>1.0</version>
<name>My Name</name>
<packaging>pom</packaging>
<properties>
<otherJar.version>1.5</otherJar.version>
...
</properties>
<dependencies>
<dependency>
<groupId>x.y</groupId>
<artifactId>art</artifactId>
<version>{$otherJar.version}</version>
</dependency>
...
</dependencies>
</project>
curl -v -F r=releases -F hasPom=true -F e=jar -F file=@pom.xml -F file=@myJar-1.0.jar -u user:pass http://link/to/nexus/service/local/artifact/maven/content
这按预期工作。 jar 与 pom.xml 文件中提到的 groupid、artifactid 和 version 一起上传到 nexus。
我的问题是 - 在我上传这个 jar 之后,如果我们有相同的 classifier
,我如何上传带有 pom.xml
的 jar?
- 我应该更改
pom.xml
文件吗?如果是这样,怎么办? - 我应该修改 curl 命令吗?我尝试添加
-F c=myClassifier
但这没有用。这导致了 Nexus 产生的错误:<html><body><error>Repository with ID='releases' does not allow updating artifacts.</error></body></html>
(因为已经有一个具有相同 groupid、artifactid 和 version 的工件 - 我刚刚上传的那个;似乎分类器被忽略了)
解决方法
因此,我尝试了多种解决方案,但无法通过一次或多次调用找到满足我需求的解决方案(通过 REST API 上传具有相同 pom 和不同分类器的多个 jar)。
我最终在运行我的脚本并使用 maven deploy:deploy-file
的机器上安装了 maven,如下所示:
maven deploy:deploy-file
-DpomFile=pom.xml
-Dfile=myJar-1.0.jar
-Dpackaging=jar // this doesn't have to be specified,it will be taken from the pom file,however in my case the pom was specifying <packaging>pom</packaging> and the jar ended up with .pom extention
-Dclassifiers=myClassifier // here you can define multiple classifiers,comma-separated
-Dtypes=jar // same as above
-Dfiles=myJar-1.0-myClassifier.jar // same as above
-DrepositoryId=nexus
-Durl=http://host:port/nexus/content/repositories/releases
您可以找到完整的文档 here。
另外,请注意您必须在 maven 的配置文件 (maven_home/conf/settings.xml
) 中定义您的 nexus 存储库凭据。
在该文件中找到节点 servers
并添加类似于以下内容的内容:
<server>
<id>nexus</id>
<username>yourUserName</username>
<password>yourPass</password>
</server>
最后我想强调一个事实,我认为这是 Nexus2 的 REST API 缺少的功能/错误。从上面的代码片段中可以看出,这可以通过使用 maven 上传 jar 来实现,也可以从 Nexus 界面手动实现。但是,我没有设法通过 REST API 做到这一点。这是可能的,因为我没有找到正确的调用方式,但我找不到 (almost) any documentation either .. 一个无赖。
另外,这个问题的最后说明 - 我不会解决这个问题,因为这不能回答我最初的问题(如何通过 REST API 实现这一点?)。