【问题标题】:How to upload or deploy multiple versions of an artifact to Sonatype Nexus?如何将工件的多个版本上传或部署到 Sonatype Nexus?
【发布时间】:2022-01-24 13:55:58
【问题描述】:

我正在寻找一种将工件的多个版本上传和存储到 Sonatype Nexus maven-2 存储库的方法,以便团队在发布和上传新版本时可以访问工件的先前版本。

我将一个 java 库上传到托管的 maven-2 发布存储库。一切正常,直到我将同一个库的另一个版本上传到同一个存储库。 上传第二个版本后,所有文件都存在于存储库中,但 Maven 无法解析不是第一个和第二个版本。

我尝试了两种上传工件的方法 - 使用 nexus UI 手动和使用 Maven 部署命令。结果是一样的。

我相信有一种方法可以将多个版本存储在一个存储库中。 这种情况有特殊配置吗?

请帮我弄清楚如何解决这个问题。

正如我所提到的,我拥有允许我从 nexus 部署和下载一个工件的所有设置。

在 pom.xml 库中我有:

    <groupId>com.company.lib</groupId>
    <artifactId>LibName</artifactId>
    <version>1.0.7</version>

    <name>LibName</name>

...

    <distributionManagement>
        <repository>
            <id>testdeploy</id>
            <url>https://nexus.company.com/repository/testdeploy/</url>
        </repository>
    </distributionManagement>

在我想下载我拥有的库的项目中:

   <dependencies>
        <dependency>
            <groupId>com.company.lib</groupId>
            <artifactId>LibName</artifactId>
            <version>1.0.7</version>
        </dependency>
    </dependencies>

    <repositories>
        <repository>
            <id>testdeploy</id>
            <url>https://nexus.company.com/repository/testdeploy/</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>

在 settings.xml 我有:

<servers>
    <server>
        <id>testdeploy</id>
        <username>...</username>
        <password>...</password>
    </server>
<servers>

<mirrors>
    <mirror>
        <id>nexus</id>
        <mirrorOf>*</mirrorOf>
        <url>https://nexus.company.com/repository/maven-public</url>
        <name>Nexus M2</name>
    </mirror>
    <mirror>
        <id>central_new</id>
        <mirrorOf>central</mirrorOf>
 <url>https://repo.maven.apache.org/maven2</url>
    </mirror>
</mirrors>

   <profiles>
       <profile>
            <id>release</id>
            <repositories>
                <repository>
                    <id>testdeploy</id>
                    <name>custom repo</name>
                    <url>https://nexus.company.com/repository/testdeploy/</url>
                </repository>
           </repositories>
        </profile>
   </profiles>

将两个版本的库上传到 nexus 后,我有以下文件结构:

com
   company
      lib
         LibName
            1.0.6
               LibName-1.0.6.jar
               LibName-1.0.6.jar.md5
               LibName-1.0.6.jar.sha1
               LibName-1.0.6.pom
               LibName-1.0.6.pom.md5
               LibName-1.0.6.pom.sha1
            1.0.7
               LibName-1.0.7.jar
               LibName-1.0.7.jar.md5
               LibName-1.0.7.jar.sha1
               LibName-1.0.7.pom
               LibName-1.0.7.pom.md5
               LibName-1.0.7.pom.sha1
            maven-metadata.xml
            maven-metadata.xml.md5
            maven-metadata.xml.sh1

当我尝试通过 Maven 下载这些版本中的任何一个时,我得到一个错误

"Could not find artifact com.company.lib:LibName:1.0.6 in nexus (nexus.company.com/repository/maven-public)" 

解决方案:

就我而言,有两个问题:

  1. “testdeploy”存储库未添加到 maven-public 组中。
  2. “testdeploy”存储库用于测试来自 maven 的部署工件的版本。我想在测试后将另一个版本的库部署到真实的仓库中。问题是真正的 repo 仍然有具有相同工件 id 和版本的库。因此,即使将“testdeploy”版本添加到“maven-public”组中,实际 repo 和测试 repo(“testdeploy”)之间也存在冲突。为了测试部署,我必须更改库的工件 ID。

一旦这两个问题得到解决,我就不需要在 pom.xml 中指定“testdeploy”存储库了。在 settings.xml 中定义镜像(maven-public)和服务器凭据的设置就足以让它工作。

【问题讨论】:

    标签: java maven nexus


    【解决方案1】:

    Maven 通过 3 个值的组合来识别唯一的工件:groupId、artifactID 和版本。将-SNAPSHOT 附加到版本有一些额外的特殊行为described here

    根据您的第一个 pom sn-p,您的工件的唯一标识符将是

    com.company.lib:LibName:1.0.7
    

    如果您想要不同的可寻址工件,请更改版本号。如果人们仍在使用原始的1.0.7,您应该生成1.0.8 或其他一些增量版本。

    值得注意的是,在此构建的项目通常使用 SemVer,这是一种以易于理解的方式运作的约定,因此可能是一个安全的起点。

    编辑添加:

    基于 cmets,并重新审查它看起来像任何试图拉 1.0.6 的东西都不是从 https://nexus.company.com/repository/testdeploy/ 这样做的。相反,它试图从nexus.company.com/repository/maven-public 中撤出并失败。

    对于要拉取 1.0.6 的项目,存储库配置是什么?如果releases 配置文件处于活动状态,您的settings.xml 只会添加testdeploy 存储库,因此需要在pom 中调用testdeploy 存储库。

    【讨论】:

    • 问题是上传两个版本后我无法下载工件。我在 UI 中看到我在 repo 中有两个版本——在我的例子中它们是 1.0.6 和 1.0.7。如果 repo 中有一个版本 Maven 可以解决依赖项,如果我有 2 个版本,我会收到错误“在 nexus (nexus.company.com/repository/maven-public) 中找不到工件 com.company.lib:LibName:1.0.6”
    • 等等,我想我看到了问题所在。它不是从nexus.company.com/repository/testdeploy 拉取,而是试图从nexus.company.com/repository/maven-public 拉取
    • 答案已更新。
    • 谢谢。您的回答有助于解决问题。我在问题中添加了一些问题原因的详细信息。
    • 很高兴我能帮上忙 :)
    【解决方案2】:

    您的方法是正确的,并且是使用不同版本的正常方式。

    我猜你只是在你的 Nexus 中遇到了不同的存储库定义问题,或者其他一些与网络相关的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-25
      • 1970-01-01
      • 1970-01-01
      • 2018-05-06
      • 2019-10-28
      • 2015-02-14
      • 1970-01-01
      相关资源
      最近更新 更多