使用 Nexus rest API 获取给定 groupid/artifactId 的最新工件版本
Posted
技术标签:
【中文标题】使用 Nexus rest API 获取给定 groupid/artifactId 的最新工件版本【英文标题】:Using the Nexus rest API to get latest artifact version for given groupid/artifactId 【发布时间】:2011-12-16 05:34:30 【问题描述】:我正在尝试使用 nexus REST api 来获取最新版本的 maven 工件。我可以使用http://repo.local/service/local/data_index?a=local-turbogears-server&from=0&g=com.turbo&c=bin&v=1.1.9
浏览到我正在寻找的特定版本,如果我删除版本参数,我可以看到每个版本。但是,当我尝试使用 RELEASE 或 LATEST 作为版本时,它返回零结果。
我检查了 nexus 磁盘上的 maven-metadata.xml 并且有最新和发布的条目。我需要采取其他步骤才能返回最新版本吗?
我目前正在使用:
Nexus v. 1.9.2
【问题讨论】:
【参考方案1】:以下 URL 将检索 log4j 1.2.x 的最新版本:
http://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=log4j&a=log4j&v=LATEST
记录在案的here
更新
使用 curl 的示例:
curl -L "http://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=log4j&a=log4j&v=LATEST" -o log4j.jar
Log4j2 更新
Log4j 1.2 自 2015 年夏季起停产,已知在 Java 9 中被破坏。
这里是 Log4j 工件的链接:
log4j-api:https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.apache.logging.log4j&a=log4j-api&v=LATEST log4j 核心:https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.apache.logging.log4j&a=log4j-core&v=LATEST【讨论】:
我能够通过将local/data_index?
替换为local/artifact/maven/redirect?
并添加存储库参数来下载最新版本的工件。还要感谢您提供文档链接 =)
如果工件不是 jar 文件怎么办?我已经发布了一个 android aar 库
@DeanWild 添加&p=aar
@DeanWild 搜索结果屏幕(可从 Nexus UI 获得)将包含指向工件的链接。
我无法让它在公司内部的 Nexus 中工作。如何找出您提供的链接和我系统中需要的链接之间的区别?我只得到 HTTP 404,仅此而已。【参考方案2】:
In Nexus LATEST 旨在与 maven 插件 一起使用,而不是与常规工件一起使用。 Nexus 根本不保证 LATEST 在其他情况下也能正常工作。如果现在它返回您正确版本的工件,明天这可能会停止工作,例如如果您为 Nexus 存储库运行重建元数据。您是否要依赖可能随时中断的机制(例如在发布过程中?)。我怀疑。阅读this article 了解更多信息。
为了找到最新的工件版本,您应该编写自己的脚本来调用搜索 API 并根据需要对工件版本进行排序。或者您可以为 Nexus 编写自己的插件。
或者,如果您的工作流程允许,您可以使用 SNAPSHOT 代替发布版本。如果您不增加数字部分,那么x.y.z-SNAPSHOT
将始终返回最新的二进制文件。
最后一点:不要使用最新版本的工件,在绝大多数情况下,如果您有这样的用例,那么您的部署(或您正在做的任何事情)有问题。一般来说,您应该知道要使用的确切版本。
【讨论】:
“最新版本”的一个简单示例是开发人员环境。开发人员通常希望在最新版本上做事,例如检查他们的最新更改如何影响他们正在开发的完整软件。 为此您构建了一个管道 - 版本在构建阶段确定,然后传递给下一个作业。至少您永远不会为此使用 LATEST,因为您最终会在管道的不同部分部署不同的版本(由于竞争条件)。 您当然不会将此添加到您的自动化步骤中。但是您的开发人员使用它手动wget
最新的 install_bundle.tar.gz
例如(或 pip install <url>
等)【参考方案3】:
此答案已复制自:https://***.com/a/39485361/1450799
我有 Linux 操作系统,但无法访问 REST API,因此我使用以下命令从 Nexus 获取最新版本的快照:
来自 WSO2 存储库的示例快照 maven-metadata.xml:
$ curl -s "http://maven.wso2.org/nexus/content/repositories/snapshots/org/wso2/is/wso2is/maven-metadata.xml"
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>org.wso2.is</groupId>
<artifactId>wso2is</artifactId>
<versioning>
<latest>5.3.0-SNAPSHOT</latest>
<release></release>
<versions>
<version>5.1.0-SNAPSHOT</version>
<version>5.2.0-SNAPSHOT</version>
<version>5.3.0-SNAPSHOT</version>
</versions>
<lastUpdated>20160914062755</lastUpdated>
</versioning>
</metadata>
从 maven-metadata.xml 中的最新 XML 标签中提取:
curl -s "http://maven.wso2.org/nexus/content/repositories/snapshots/org/wso2/is/wso2is/maven-metadata.xml" | \
grep "<latest>.*</latest>" | \
sed -e "s#\(.*\)\(<latest>\)\(.*\)\(</latest>\)\(.*\)#\3#g"
从 maven-metadata.xml 中的版本 XML 标记中提取:
curl -s "http://maven.wso2.org/nexus/content/repositories/snapshots/org/wso2/is/wso2is/maven-metadata.xml" | \
grep "<version>.*</version>" | \
sort --version-sort | uniq | tail -n1 | \
sed -e "s#\(.*\)\(<version>\)\(.*\)\(</version>\)\(.*\)#\3#g"
直到今天 2016 年 9 月 14 日这两个命令的结果是:
5.3.0-SNAPSHOT
【讨论】:
不知道为什么所有的反对票?这种方法对于我们这些使用不再有 REST API 的 Nexus 3 的人特别有用 我知道 *** 中有一个徽章,可以通过投反对票来达到。出于这个原因,许多人搜索并投反对票的第一件事是他们无法理解以达到徽章:) 适用于 Nexus 3。我想补充一点:sort --version-sort
效果更好:它会将 1.0.9、1.0.10、1.0.11 视为正确的顺序,而不是字母顺序, 默认 (1.0.10, 1.0.11, 1.0.9)
阅读 maven-metadata.xml 是个好主意,但似乎 在尝试使用 LATEST
版本的 REST 服务并发现它并不总是有效(参见 @Stanislav response)后,我最终创建了这个用于解析 metadata.xml 文件的单行 Linux 命令:
wget -O - -o /dev/null https://repo1.maven.org/maven2/org/brutusin/wava/maven-metadata.xml | grep -Po '(?<=<version>)([0-9\.]+(-SNAPSHOT)?)' | sort --version-sort -r | head -n 1
只需将 url 更改为适当的 url,它应该适合你。
干杯
【讨论】:
对于Nexus 3.0及以上的对于最新版本的 Nexus(自 3.16.0 起):使用浏览器从 maven releases
存储库下载最新版本(以 zip 文件格式存储)的示例:
http://<YourNexusUrl>/service/rest/v1/search/assets/download?sort=version&repository=maven-releases&maven.groupId=<yourGroupID>&maven.artifactId=<yourArtifactID>&maven.extension=zip
使用卷曲:
curl -L -X GET "http://<YourNexusUrl>/service/rest/v1/search/assets/download?sort=version&repository=maven-releases&maven.groupId=<yourGroupID>&maven.artifactId=<yourArtifactID>&maven.extension=zip" --output myZip.zip
【讨论】:
【参考方案6】:在 Nexus API 的最新版本中记录了检索组件最新版本的方法,按存储库、组、工件和基础版本进行过滤
示例: http://localhost:8081/service/rest/v1/search/assets/download?sort=version&repository=maven-snapshots&maven.groupId=org.foo.bar&maven.artifactId=project&maven.baseVersion=1.2.3-SNAPSHOT&maven.extension=罐子
参考文档: https://help.sonatype.com/repomanager3/rest-and-integration-api/search-api#SearchAPI-SearchComponents
【讨论】:
以上是关于使用 Nexus rest API 获取给定 groupid/artifactId 的最新工件版本的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 FishEye REST API 请求或 EyeQL 或任何其他可能的方式获取给定变更集 ID 的相关 JIRAISSUEKEY?
如何从Google Fitness REST API检索步数数据?
我不能在 apollo-server 中创建一个 rest API 吗?