从上游和外部连接请求 Maven 程序包 - CodeArtifact

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

从上游和外部连接请求 Maven 程序包

导入标准资产名称

从公共存储库(例如 Maven Central)导入 Maven 包版本时,AWS CodeArtifact 会尝试导入该软件包版本中的所有资产。如 请求包含上游存储库的程序包版本 中所述,在以下时候会发生导入:

  • 客户端向 CodeArtifact 存储库请求 Maven 资产。

  • 程序包版本尚未出现在存储库或其上游中。

  • 存在与公有 Maven 存储库的可访问外部连接。

尽管客户端可能只请求了一个资产,但仍会 CodeArtifact 尝试导入它能找到的适用于该软件包版本的所有资产。如何 CodeArtifact 发现哪些资产可用于 Maven 软件包版本取决于特定的公共存储库。一些公有 Maven 存储库支持请求资产列表,但其他存储库则不支持。对于不提供列出资产的方式的存储库, CodeArtifact 会生成一组可能存在的资产名称。例如,当请求任何 Maven 包版本的资源junit 4.13.2时, CodeArtifact 将尝试导入以下资产:

  • junit-4.13.2.pom

  • junit-4.13.2.jar

  • junit-4.13.2-javadoc.jar

  • junit-4.13.2-sources.jar

导入非标准资产名称

当 Maven 客户端请求的资产与上述模式之一不匹配时, CodeArtifact 会检查该资产是否存在于公共存储库中。如果存在资产,则会将其导入并添加到现有的程序包版本记录(如果存在)中。例如,Maven 程序包版本 com.android.tools.build:aapt2 7.3.1-8691043 包含以下资产:

  • aapt2-7.3.1-8691043.pom

  • aapt2-7.3.1-8691043-windows.jar

  • aapt2-7.3.1-8691043-osx.jar

  • aapt2-7.3.1-8691043-linux.jar

当客户请求 POM 文件时,如果无法列出软件包版本的资产,则 POM 将 CodeArtifact 是唯一导入的资产。这是因为其他资产都不符合标准资产名称模式。但是,当客户端请求其中一个 JAR 资产时,该资产将被导入并添加到存储在中的现有软件包版本中 CodeArtifact。最下游存储库(客户端向其发出请求的存储库)和具有外部连接的存储库中的程序包版本都将更新为包含新资产,如上游存储库的程序包保留中所述。

通常,软件包版本一旦保留在 CodeArtifact 存储库中,就不会受到上游存储库中更改的影响。有关更多信息,请参阅 上游存储库的程序包保留。但是,对于具有前面所述的非标准名称的 Maven 资产,其行为与此规则不同。虽然如果客户端没有请求额外的资产,下游程序包版本就不会更改,但在这种情况下,保留的程序包版本在最初保留后经过修改,因此不是一成不变的。这种行为是必要的,因为否则将无法通过 CodeArtifact访问具有非标准名称的 Maven 资产。如果将软件包版本保留在存储库中之后,将其添加到公共存储库上的 Maven 软件包版本中,则该行为也会启用。 CodeArtifact

检查资产来源

将新资源添加到先前保留的 Maven 软件包版本时, CodeArtifact 确认保留的软件包版本的来源与新资产的来源相同。这可以防止创建“混合”程序包版本,其中不同的资产来自不同的公有存储库。如果不进行此检查,则如果将 Maven 包版本发布到多个公共存储库,并且这些存储库是存储库上游图的一部分,则可能会发生资产混合。 CodeArtifact

在上游存储库中导入新资产和程序包版本状态

上游存储库中软件包版本的软件包版本状态可能会 CodeArtifact 阻止在下游存储库中保留这些版本。

例如,假设一个域有三个存储库:repo-Arepo-Brepo-C,其中 repo-Brepo-A 的上游存储库,repo-Crepo-B 的下游存储库。

上游存储库中新资产和软件包版本的工作原理示意图。

repo-B 中存在 Maven 程序包 com.android.tools.build:aapt2 的程序包版本 7.3.1,其状态为 Published。它不存在于 repo-A 中。如果客户端从 repo-A 请求此程序包版本的资产,则响应将为 200(正常),且 Maven 程序包版本 7.3.1 将保留在 repo-A 中。但是,如果 repo-B 中的程序包版本 7.3.1 的状态为 ArchivedDisposed,则响应将为 404(未找到),因为处于这两种状态的程序包版本的资产不可下载。

请注意,为 repo-Arepo-Brepo-C 中的 com.android.tools.build:aapt2程序包来源控制设置为 upstream=BLOCK,则无论程序包的版本状态是什么,都可防止从 repo-A 为该程序包的所有版本提取新资产。