Maven 2 如何修复Nexus存储库中不正确的校验和?

Maven 2 如何修复Nexus存储库中不正确的校验和?,maven-2,nexus,Maven 2,Nexus,我的本地Nexus存储库中的某些工件没有正确的校验和。例如(错误校验和): cat central/org/codehaus/plexus/plexus编译器api/1.8/plexus-compiler-api-1.8.pom.sha1 95f3332c2bbace129da501424f297e47dd0e976b vs(正确校验和): sha1sum central/org/codehaus/plexus/plexus编译器api/1.8/plexus-compiler-api-1.8.p

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

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

vs(正确校验和):

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

看起来我的存储库中有一些工件是在激活时下载的

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

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

更新:

我看了更多,我几乎肯定我知道我的问题的根源是什么。我遇到麻烦的一个工件是这个():

在我的存储库中,.pom和.pom.sha1的时间戳都是2010年3月29日。在central,.pom的时间戳为2010年3月29日,而.pom.sha1的时间戳为2010年4月21日。我在读关于他的书。我假设,2010年4月21日,Maven Central重建了元数据并验证了校验和,从而修复了plexus编译器api:1.8工件的错误.sha1

根据上面的Sonatype链接,我应该能够使Maven Central的缓存过期,并让我的本地安装获取时间戳比最初缓存的工件更新的任何东西的新副本。然而,根据我观察到的行为,我认为它只是检查工件文件的时间戳,而不是校验和文件

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


我注意到我的Nexus版本很旧(1.5 vs 1.9.1),所以我将尝试更新,看看新版本是否能更好地使缓存过期。如果不是,我可能会看看Sonatype的人怎么想(可能是个bug?)

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

首先,过期缓存不会从Nexus的本地缓存中删除任何内容,它只是将它们标记为“旧”。将项目标记为“旧”的效果将在下一个请求相同工件的传入请求中显示(如果从未请求,则“旧”工件就在那里)。这意味着,缓存过期本身不会导致Nexus下载远程更改(更新)的文件。Nexus从不自行下载(如果我们在本次讨论中忽略索引)。您必须强制客户机(Maven)请求它们,这将导致以下一系列操作:“缓存旧内容”、远程更改检测,最后重新下载并缓存新文件

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

应该进行重新下载,例如,如果您使用核武器攻击Maven的本地存储库,并使用干净/空的存储库进行重建。在这种情况下,Maven应该同时请求JAR工件和校验和文件——但从您的描述来看,不清楚在Nexus上的缓存过期后您(或您是否?)是如何调用Maven的

试试这个:

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

b) nuke local repository(或通过篡改~/.m2/settings.xml将其重定向到新的干净文件夹

c) 让Maven构建您的项目,它应该同时重新蚀刻JAR和校验和文件(通过使用空/无核本地存储库)

希望这能解释你写的一些东西

参考。

这是一个错误

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

Nexus(1.9.1)假设如果工件时间戳不变,校验和也应该不变。大多数情况下,这是正确的,但是,由于Maven中的旧bug使用不正确的校验和部署工件,很少有工件可以保持不变但有更新的校验和的情况

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

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

谢谢你的帮助,塔马斯