使用 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 是个好主意,但似乎 元素不可靠,如其他答案中所述,请参阅articles.javatalks.ru/articles/32。【参考方案4】:

在尝试使用 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及以上的不再存在,可以使用 @dannrob 我更新了脚本以支持这两个选项【参考方案5】:

对于最新版本的 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 的最新工件版本的主要内容,如果未能解决你的问题,请参考以下文章

【nexus】用curl调用服务API对输出json的处理

如何使用 FishEye REST API 请求或 EyeQL 或任何其他可能的方式获取给定变更集 ID 的相关 JIRAISSUEKEY?

如何从Google Fitness REST API检索步数数据?

我不能在 apollo-server 中创建一个 rest API 吗?

如何构建一个 REST API,该 API 采用资源 id 的数组

Instagram 新 API,按标签获取商品