ARTIFACTORY:揭示虚拟存储库解决方案
有时,当您试图从Virtual Repository下载工件时,会得到一个错误,但是当使用底层的Local或Remote时,相同的URL可以工作。当绕过虚拟存储库绕过问题时,这意味着虚拟可能在其逻辑中存在问题。
在这些情况下,运行一个特殊的API来诊断问题很有帮助。
“?跟踪“API
自从Artifactory引入了虚拟存储库,存在一个特殊的调试API来打印它的工件解析逻辑.该API允许您查看下载背后的底层逻辑,包括对Maven Central等远程源进行的外发搜索。
要查看调试信息,请添加“?”trace"令牌到经过Virtual的下载URL的末尾:curl -u
注意:不能在包管理器路径上使用Trace API,例如“API /pypi/pypi-virtual/[…]?”Trace”将不起作用。请尝试使用文件路径。
当您使用这个API时,您将收到一个调试打印输出,而不是得到一个文件。调试输出是Artifactory用于查找文件的逻辑。当对复杂的虚拟存储库进行故障排除时,这是非常有用的,因为有时是非常大的解析订单会导致意想不到的逻辑问题吗.
请确保在使用此API时进行身份验证,trace API会像Virtual一样检查您的凭据。你甚至可以看到哪些存储库将被跳过,如果你的帐户没有访问它们。
打印输出中的许多信息都是调试信息,没有多大帮助。下面您可以在打印输出中找到一些关键标签。以下示例是从Virtual解析文件时的一些常见结果:查找本地文件、远程下载和404 Not Found事件。
这些例子是在一个虚拟机上执行的,其中有两个存储库,一个小型的本地存储库和一个指向Maven Central的远程存储库:

在lib -snapshot-local中查找本地POM文件
Artifactory的Virtual Repository系统首先搜索所有本地存储库。如果找到该文件,它将不会查询Maven Central。
[命令使用示例]curl -u admin“https://artifactory.com/libs-snapshot/jfrog/hello/1.0.8-SNAPSHOT/hello-1.0.8-20220526.215602-2.pom?trace”
输出:
2022-10-17T14:11:10.187-07:00执行anyBeforeDownloadRequest用户插件可能存在
- 开始解决过程
- 输出输出任何用户插件这可能会阻止或修改下载请求
- 没有,所以Artifactory继续搜索
无法找到资源在libs-snapshot: jfrog / hello / 1.0.8-SNAPSHOT / hello - 1.0.8 - 20220526.215602 - 2. - pom
- 注意:该文件不是直接在虚拟中找到的
- 一些虚拟(如Debian Virtual)实际上将元数据文件保存在其中
- Debian Virtuals这样做是因为在索引期间合并了Locals和Remotes的元数据
2022 - 10 - 17 - t14:11:10.189 07:00返回找到的资源从libs-snapshot-local: jfrog / hello / 1.0.8-SNAPSHOT / hello - 1.0.8 - 20220526.215602 - 2. - pom
- 此搜索在Local中找到工件,因此返回该文件
- 不查询Maven Central,也不检查Remote Repo缓存
2022-10-17T14:11:10.190-07:00创建资源处理从“libs-snapshot-local: jfrog / hello / 1.0.8-SNAPSHOT / hello - 1.0.8 - 20220526.215602 - 2. - pom的
- “资源处理是本地/远程中直接文件的路径
- 它被传递给父虚拟类,以便下载函数知道要返回什么文件
2022 - 10 - 17 - t14:11:10.216 07:00请求成功
- 这意味着请求成功了!
- 使用此路径,不使用“?”跟踪“APIon the end should return the file found in libs-snapshot-local
在Maven-Central中查找远程POM文件
接下来,让我们下载一个只在Maven Central中可用的新文件,它还没有被Artifactory下载。要下载它,Artifactory必须先搜索Locals,然后再在线搜索。
[命令使用示例]Curl -u admin -v "https://artifactory.com/artifactory/libs-snapshot/com/sun/pkg/pkg-java/1.0.0-alpha-1/pkg-java-1.0.0-alpha-1.pom?trace"
输出:
2022-10-17T14:26:40.535-07:00搜索里面的资源libs-snapshot-local
2022 - 10 - 17 - t14:26:40.535 07:00无法找到资源libs-snapshot-local: com/sun/pkg/pkg - java/1.0.0 -α- 1/pkg - java - 1.0.0 -α- 1. - pom
- 看起来包不在lib -snapshot-local中…
2022-10-17T14:26:40.535-07:00搜索里面的资源maven-central-cache
2022 - 10 - 17 - t14:26:40.536 07:00无法在maven-central-cache中找到资源: com/sun/pkg/pkg - java/1.0.0 -α- 1/pkg - java - 1.0.0 -α- 1. - pom
- 看起来它也不在缓存里…
2022-10-17T14:26:40.536-07:00搜索里面的资源maven
使用远程请求URL - https://repo.maven.apache.org/maven2/com/sun/pkg/pkg-java/1.0.0-alpha-1/pkg-java-1.0.0-alpha-1.pom
2022-10-17T14:26:40.537-07:00执行HEAD请求到https://repo.maven.apache.org/maven2/com/sun/pkg/pkg-java/1.0.0-alpha-1/pkg-java-1.0.0-alpha-1.pom
发现内容长度为1678的远程资源
- 首先,完成HEAD检查,Artifactory找到一个文件
- 这样可以节省网络带宽,并且仅在远程站点限制频繁的GET请求时才这样做
2022 - 10 - 17 - t14:26:40.868 07:00在maven-central找到资源
资源是精确匹配-返回
返回在聚合存储库中找到的资源
- Artifactory已经找到了该文件,它的逻辑表明可以下载它
2022 - 10 - 17 - t14:26:40.880 07:00执行GET请求https://repo.maven.apache.org/maven2/com/sun/pkg/pkg - java/1.0.0 -α- 1/pkg - java - 1.0.0 -α- 1. - pom
2022-10-17T14:26:40.933-07:00下载内容#开始下载
2022-10-17T14:26:40.933-07:00保存资源到maven-central-cache
2022-10-17T14:26:41.019-07:00下载内容#下载完成- 0.1秒
- 这是文件下载事件
- 您可以使用时间戳来查看下载所需的时间
2022 - 10 - 17 - t14:26:41.020 07:00创建资源句柄从“maven-central-cache: com/sun/pkg/pkg - java/1.0.0 -α- 1/pkg - java - 1.0.0 -α- 1. - pom的
- Artifactory再次向Virtual发送资源句柄指针,以便下载正确的文件
- 注意这里使用缓存,因为文件已经下载并缓存了
404 Not Found示例
在本例中,请求了一个不存在的包。“pkg-java”POM文件路径被调整为错误的值。
[命令使用示例]Curl -u admin -v "https://artifactory.com/artifactory/libs-snapshot/com/sun/pkg/pkg-java/1.0.0-alpha-1/pkg-java-1.0.0-alpha-d.pom?trace"
输出
2022-10-17T14:46:33.906-07:00搜索里面的资源libs-snapshot-local
2022 - 10 - 17 - t14:46:33.907 07:00无法在lib -snapshot-local中找到资源: com/sun/pkg/pkg-java/1.0.0-alpha-1/pkg-java-1.0.0-alpha-d.pom
2022-10-17T14:46:33.907-07:00搜索里面的资源maven-central-cache
2022-10-17T14:46:33.908-07:00无法在maven-central-cache: com/sun/pkg/pkg-java/1.0.0-alpha-1/pkg-java-1.0.0-alpha-d.pom
- 在缓存或本地未找到,下一步Artifactory查询远程…
使用远程请求URL - https://repo.maven.apache.org/maven2/com/sun/pkg/pkg-java/1.0.0-alpha-1/pkg-java-1.0.0-alpha-d.pom
2022-10-17T14:46:33.908-07:00执行HEAD请求到https://repo.maven.apache.org/maven2/com/sun/pkg/pkg-java/1.0.0-alpha-1/pkg-java-1.0.0-alpha-d.pom
2022 - 10 - 17 - t14:46:34.242 07:00在远程信息请求上收到状态404(消息:未找到)-返回未找到的资源
- 在Maven Central中也没有找到资源
- 注意,Artifactory只做了一个HEAD请求,这个请求失败了。之后它没有尝试GET
- 你可以绕过HEAD请求在远程存储库设置中发出GET请求
2022 - 10 - 17 - t14:46:34.242 07:00配置为隐藏未授权资源的真实状态= false2022世界杯阿根廷预选赛赛程对于repo lib -snapshot
原始响应状态与认证相关= false
使用'的原始响应状态404'和消息'找不到资源'
发送状态为“404”的响应,消息为“无法找到资源”
- “隐藏未授权资源的存在2022世界杯阿根廷预选赛赛程“设置确定用户是否得到401/403,而不是404
- 搜索完成后,将向下载客户端返回404 Not Found。
