Artifactory忽略maven-metadata.xml文件上的校验和上传

时间:2017-11-28 15:57:10

标签: maven-3 artifactory

我有一个大型的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在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"}

1 个答案:

答案 0 :(得分:0)

当我尝试使用JFrog REST API将模块发布到Artifactory托管的Maven存储库时,在Intellij中也遇到类似的问题。问题是:显然(按照日志所说),常规Deploy Apache Maven Plugin发送文件.sh1.md5以及模块,例如.jar文件,但是具有sha1md5值的JFrog REST API expects a HTTP header,而不是文件。

我找到的解决方案:使用Maven Artifactory Plugin。它处理了这一部分(显然是可以解决的,因为错误已经消失了,但是我看不到到底是怎么回事)。