如何将工件的多个版本上传或部署到 Sonatype Nexus?

How to upload or deploy multiple versions of an artifact to Sonatype Nexus?

我正在寻找一种将工件的多个版本上传并存储到 Sonatype Nexus maven-2 存储库的方法,这样,如果发布并上传了新版本,团队就可以访问该工件的先前版本。

我将 java 库上传到托管的 maven-2 发布存储库。一切正常,直到我将同一库的另一个版本上传到同一存储库。 上传第二个版本后,所有文件都出现在存储库中,但 Maven 无法解析 not first nether second versions.

我尝试了两种上传工件的方法——手动使用 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. maven-public 组中未添加“testdeploy”存储库。
  2. “testdeploy”回购是为了测试来自 maven 的部署工件的版本。我想在测试后将另一个版本的库部署到真实的 repo 中。问题是真正的 repo 仍然有具有相同工件 ID 和版本的库。因此,即使将“testdeploy”版本添加到“maven-public”组中,真实仓库和测试仓库(“testdeploy”)之间也存在冲突。为了测试部署,我必须更改库的工件 ID。

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

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

根据您的第一个 pom 片段,您的工件的唯一标识符将是

com.company.lib:LibName:1.0.7

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

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

编辑添加:

根据评论,re-review 看起来任何试图从 https://nexus.company.com/repository/testdeploy/ 中提取 1.0.6 的东西都没有这样做。相反,它试图从 nexus.company.com/repository/maven-public 中退出并失败。

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

您的方法是正确的,也是处理不同版本的正常方法。

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