API/元数据来查找 Maven 工件的发布日期?

Rob*_*ley 7 java scala artifact maven maven-release-plugin

给定您能够解析的任意已发布工件的 Maven 坐标(组、工件、版本)(该工件可能已发送至 Maven Central,也可能未发送至 Maven Central - 可能已发布至另一个工件存储库、公共或私人),确定该工件的发布日期的最佳方法是什么?

使用案例

Scala Steward是一个机器人,可以帮助保持项目库依赖项最新,自动打开 PR 来更新依赖项。但是,某些依赖项(例如 AWS Java SDK)更新过于频繁,导致 PR 数量过多。为了让 Scala Steward处理这个问题,Scala Steward 了解其正在考虑更新的工件的发布日期将很有帮助。

...一些可用的数据来源

一些资源:

另请参阅使用 Aether Eclipse 检索工件发布日期,该问题仅针对 Aether Eclipse 库(现在称为Maven Artifact Resolver)提出了这个问题,而我很想知道是否有任何东西可以可靠地获取此信息。

Hol*_*ins 1

感谢这个问题——这基本上是一个答案,并对选项进行了彻底的讨论。我已经成功地使用了第三个选项的变体,即访问原始目录列表。除了文件级时间戳信息之外,还可能有last-modified标头。(例如,对于 Maven Central 来说,这肯定是存在的。)它是一个字符串,所以我认为格式没有保证,但它应该可以用大多数现代日期时间库进行解析。

例如,给定maven中心url https://search.maven.org/artifact/io.quarkiverse.renarde/quarkus-renarde/3.0.0/jar,右侧有一个“浏览”链接,你到https://repo1.maven.org/maven2/io/quarkiverse/renarde/quarkus-renarde/3.0.0/。在该端点上进行HEAD调用会为您提供标头(或者您可以只进行正常GET调用,然后查看标头)。

从 Maven API 的 json 中返回的时间戳和标头中的时间戳相差几个小时,但通常对于版本,我们不关心确切的时间。

在 javascript 中(仅作为示例),给定一个具有 Maven gav 信息的对象,该逻辑将如下所示:

const url = `https://repo1.maven.org/maven2/${coordinates.groupId?.replace(/\./g, "/")}/${coordinates.artifactId}/${coordinates.version}/`
const listingHeaders = await axios.head(mavenArtifactsUrl)
const lastModified = listingHeaders.headers["last-modified"]
return Date.parse(lastModified)
Run Code Online (Sandbox Code Playgroud)