微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 curl 从 REST API 在 Nexus 2 上上传具有不同分类器和相同 pom.xml 的 jars?

如何解决如何使用 curl 从 REST API 在 Nexus 2 上上传具有不同分类器和相同 pom.xml 的 jars?

我已经为此苦苦挣扎了一段时间。

背景:我们有一些 Jenkins 作业会生成 jars 和其他将 jars 上传到 nexus 的作业。在我们的例子中,我们正在寻找 myJar-1.0.jarmyJar-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 命令(没有分类器的 jar)是:

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 实现这一点?)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。