如何将工件的多个版本上传或部署到 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)"
解法:
在我的例子中有两个问题:
- maven-public 组中未添加“testdeploy”存储库。
- “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 中不同存储库定义的问题,或者其他一些与网络相关的问题。
我正在寻找一种将工件的多个版本上传并存储到 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)"
解法:
在我的例子中有两个问题:
- maven-public 组中未添加“testdeploy”存储库。
- “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 中不同存储库定义的问题,或者其他一些与网络相关的问题。