【发布时间】:2018-05-12 03:47:20
【问题描述】:
我有一个大型 Maven 存储库,由 Artifactory 版本 5.4.6 托管。 使用 JFrog REST API,我可以使用
查看所有错误或缺失的校验和curl -u "admin:$PASSWORD" -X GET "http://myserver/artifactory/api/search/badChecksum?type=sha1&repos=mymavenrepo"
这会为我的所有“maven-metadata.xml”文件返回大量关于“缺少客户端校验和”的错误。
但是,我使用发布校验和的 maven 插件部署 repo 中的所有文件。当我部署新文件时,我可以在 logs/request.log 中看到
- 现有的 maven-metadata.xml 已下载(在 maven-metadata.xml 上获取)
- 已上传更新的 maven-metadata.xml(PUT on maven-metadata.xml)
- 已上传更新后的 maven-metadata.xml 的 MD5 哈希(PUT 到 maven-metadata.xml.md5)
- 已上传更新后的 maven-metadata.xml 的 SHA1 哈希(PUT 到 maven-metadata.xml.sha1)
在 CLI 上进行一些测试,我可以确认设置校验和的 PUT 调用适用于普通文件,但在 maven-metadata.xml 文件上被忽略。
对于标准 JAR
FAKE_SHA1=0000111122223333444455556666777788889999
curl -u "admin:$PASSWORD" -X PUT "http://myserver/artifactory/mymavenrepo/javax/mail/mail/1.4.3/mail-1.4.3.jar.sha1" --data-ascii "$FAKE_SHA1"
将返回以下错误
{
"errors" : [ {
"status" : 409,
"message" : "Checksum error for 'javax/mail/mail/1.4.3/mail-1.4.3.jar.sha1': received '0000111122223333444455556666777788889999' but actual is '8154bf8d666e6db154c548dc31a8d512c273f5ee'"
} ]
}
对于一个 maven-metada.xml 文件
FAKE_SHA1=0000111122223333444455556666777788889999
curl -u "admin:$PASSWORD" -X PUT "http://myserver/artifactory/mymavenrepo/javax/mail/mail/maven-metadata.xml.sha1" --data-ascii "$FAKE_SHA1"
绝对不会返回任何东西
现在,启动 badChecksum 会抱怨 JAR 有错误的客户端校验和,但会继续抱怨 maven 元数据没有客户端校验和:
curl -u "admin:$PASSWORD" -X GET "http://myserver/artifactory/api/search/badChecksum?type=sha1&repos=mymavenrepo" | grep "javax/mail" -A2
返回
"uri" : "http://myserver/artifactory/api/storage/mymavenrepo/javax/mail/mail/maven-metadata.xml",
"serverSha1" : "61001c349ebaac8e116d5f25716e2abf31e081af",
"clientSha1" : ""
--
"uri" : "http://myserver/artifactory/api/storage/mymavenrepo/javax/mail/mail/1.4.3/mail-1.4.3.jar",
"serverSha1" : "8154bf8d666e6db154c548dc31a8d512c273f5ee",
"clientSha1" : "0000111122223333444455556666777788889999"
maven-metadata.xml 文件有什么奇怪的校验和语义吗? 这对我来说基本上破坏了 badChecksum REST 功能,因为这些元数据错误会淹没合法错误。
我的观点是,要么 maven-metadata.xml 文件是特殊的,badChecksum 应该忽略它们,要么它们就像普通文件一样,应该记录客户端校验和......
我看到的唯一解决方法是使用 fixChecksum API,但是您只需接受服务器校验和而不是推送本地校验和...
curl -u "admin:$PASSWORD" -X POST "http://myserver/artifactory/api/checksums/fix" --data-ascii "{\"repoKey\":\"mymavenrepo\",\"path\":\"javax/mail/mail/maven-metadata.xml\"}" --header "Content-Type: application/json"
{"info":"Successfully fixed checksum inconsistency"}
【问题讨论】:
-
我很乐意收到评论来解释否决票。我认为缺少客户端校验和对很多人来说很烦人。如果我遗漏了一些明显的东西,我想知道......
-
maven-metadata.xml 是 Artifactory 根据相邻文件夹的内容自动生成的,为什么要为它设置校验和..?
-
如果您使用 maven 命令行部署工件,maven 将自身下载现有的 maven-metadata.xml 并在之后重新上传。 AFAICS,这个逻辑在 maven-artifact-transfer 的 org.eclipse.aether.internal.impl.DefaultDeployer 类中。您可以从标准 maven 项目中进行以下测试:
mvn clean install deploy:deploy -DaltDeploymentRepository=test::default::http://myserver/artifactory/mymavenrepo您将在日志中看到部署插件首先下载元数据,然后再重新上传。
标签: maven-3 artifactory