【问题标题】:Using the Nexus rest API to get latest artifact version for given groupid/artifactId使用 Nexus rest API 获取给定 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

【问题讨论】:

    标签: maven-2 maven nexus


    【解决方案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 工件的链接:

    【讨论】:

    • 我能够通过将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://stackoverflow.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 的人特别有用
    • 我知道 Stackoverflow 中有一个徽章,可以通过投反对票来达到。出于这个原因,许多人搜索并投反对票的第一件事是他们无法理解以达到徽章:)
    • 适用于 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

      【讨论】:

        猜你喜欢
        • 2013-01-24
        • 2017-06-28
        • 2021-10-12
        • 2012-06-06
        • 2014-06-24
        • 1970-01-01
        • 2020-12-09
        • 1970-01-01
        • 2012-08-26
        相关资源
        最近更新 更多