【发布时间】: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)"
解决方案:
就我而言,有两个问题:
- “testdeploy”存储库未添加到 maven-public 组中。
- “testdeploy”存储库用于测试来自 maven 的部署工件的版本。我想在测试后将另一个版本的库部署到真实的仓库中。问题是真正的 repo 仍然有具有相同工件 id 和版本的库。因此,即使将“testdeploy”版本添加到“maven-public”组中,实际 repo 和测试 repo(“testdeploy”)之间也存在冲突。为了测试部署,我必须更改库的工件 ID。
一旦这两个问题得到解决,我就不需要在 pom.xml 中指定“testdeploy”存储库了。在 settings.xml 中定义镜像(maven-public)和服务器凭据的设置就足以让它工作。
【问题讨论】: