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

Rya*_*n J 6 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

看起来我的存储库中有一些工件在此错误处于活动状态时已下载.

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维护的内容.我假设,在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的想法(也许这是一个错误?).

Tam*_*nak 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"代理存储库上运行expire缓存

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

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

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

参考JIRA问题讨论相同的事情.