如何在Nexus存储库中修复错误的校验和?

时间:2011-04-22 01:54:10

标签: maven-2 nexus

我本地Nexus存储库中的一些工件没有正确的校验和。例如(错误的校验和):

  

cat central / org / codehaus / plexus / plexus-compiler-api / 1.8 / plexus-compiler-api-1.8.pom.sha1   95f3332c2bbace129da501424f297e47dd0e976b

vs(正确的校验和):

  

sha1sum central / org / codehaus / plexus / plexus-compiler-api / 1.8 / plexus-compiler-api-1.8.pom   4c2947f7e2d09b6e13da34292d897c564f1f9828

看起来我的存储库中有一些工件在this bug处于活动状态时已下载。

Maven Central现在有正确的校验和(4c29 ...),但我本地Nexus存储库中的校验和仍然过时。我不知道如何让我的本地存储库验证和/或从中央重新下载正确的校验和。

修复本地存储库的正确方法是什么。这个问题没有太多的工件,所以我认为我可以(手动)验证它们仍然存在于中央并从我的本地存储库中删除它们。应该使用正确的校验和重新缓存它们。还有更好的方法吗?

更新

我更多地看了这个,我几乎是肯定的,我知道我的问题来源是什么。我遇到问题的其中一件工件就是这件(plexus-compiler-api:1.8):

在我的存储库中,.pom和.pom.sha1都被加上时间戳为2010年3月29日。在中央,.pom的时间戳为2010年3月29日,而.pom.sha1的时间戳为2010年4月21日。我正在阅读Nexus maintenance。我假设,在2010年4月21日,Maven Central重建了元数据并验证了校验和,这些校验和修复了plexus-compiler-api:1.8工件的错误.sha1。

根据上面的Sonatype链接,我应该可以使Maven Central的缓存过期,并让我的本地安装使用比最初缓存的工件更新的时间戳来提取新副本。但是,基于我观察到的行为,我认为它只检查工件文件的时间戳,而不是校验和文件。

就我当地的Nexus存储库而言,我拥有该工件的最新版本(2010年3月29日),因此无需重新下载任何内容。

我注意到我的Nexus版本相当老(1.5 vs 1.9.1),所以我会尝试更新并查看新版本是否能更好地过期缓存。如果没有,我可能会看到Sonatype的想法(也许这是一个错误?)。

2 个答案:

答案 0 :(得分:9)

不,你面对的是Nexus和Maven的定义行为。

首先,到期缓存不会从Nexus的本地缓存中删除任何内容,只是将它们标记为“旧”。将项目标记为“旧”的效果显示在下一个请求相同工件的传入请求中(如果从未要求,则“旧”工件就位于那里)。意思是,单独过期缓存不会导致Nexus下载远程更改(更新)的文件。 Nexus永远不会自己下载(如果我们从讨论中省略索引)。您必须强制客户端(Maven)请求它们 - 这将导致以下操作链:“缓存旧内容”,远程更改检测以及最终重新下载和缓存新文件。

接下来,这里发生的是Maven,因为工件(JAR文件)没有改变,甚至没有请求校验和文件,因此没有“触发”Nexus端的“旧”标记校验和重新获取。另外需要注意的是,如果我们谈论已发布的工件(并且Maven Central仅包含已发布的工件),Maven将永远不会重新检查它们,除非它们不存在于本地存储库中(一旦进入本地存储库,Maven将永远不会尝试重新获取他们)。这意味着,您需要将它们从本地存储库中删除,以确保Maven将从Nexus请求它们,最后,Nexus将检测远程校验和文件的更改并执行您真正想要的操作。

重新下载应该会发生,例如,如果您修改了Maven的本地存储库并使用干净/空的存储库进行重建。在这种情况下,Maven应该同时询问JAR工件和校验和文件 - 但是根据你的描述,你不清楚你是如何(或者是你?)在Nexus上的缓存到期后调用Maven。

试试这个:

a)在Nexus“Maven Central”代理存储库中运行过期缓存

b)nuke本地存储库(或者通过篡改〜/ .m2 / settings.xml将其重定向到新的干净文件夹

c)让Maven构建你的项目,它应该同时重新获取JAR和校验和文件(通过使用empty / nuked本地存储库)

希望这能解释你写的一些内容。

参考JIRA issue discussing same thing

答案 1 :(得分:3)

这是一个错误。

正如Tamas所解释的,当代理存储库缓存过期时,Nexus将检查远程存储库是否有更新的时间戳。本地缓存的工件本质上被标记为脏,并且在需要从本地Nexus服务器请求工件时,根据需要检查更新的工件。

Nexus(1.9.1)假设如果工件时间戳不变,校验和也应保持不变。大部分时间都是如此,但是,由于Maven中的旧错误正在部署具有错误校验和的工件,因此很少有工件可以保持不变但具有更新的校验和。

我认为现在处理此问题的最佳方法是移动任何错误的校验和,并让Nexus在下次请求时尝试重新解决它们:

mv plexus-compiler-api.pom.sha1 plexus-compiler-api-1.8.pom.sha1.bak

感谢Tamas的帮助。