我本地 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 的时间戳都为 29-Mar-2010。在中央,.pom 的时间戳为 29-Mar-2010,而 .pom.sha1 的时间戳为 21-Apr-2010。我正在阅读 Nexus maintenance .我假设在 2010 年 4 月 21 日,Maven Central 重建了元数据并验证了校验和,从而修复了 plexus-compiler-api:1.8 工件的不正确 .sha1。
根据上面的 Sonatype 链接,我应该能够使 Maven Central 的缓存过期,并让我的本地安装使用比最初缓存的工件更新的时间戳提取任何内容的新副本。但是,根据我观察到的行为,我认为它只是检查工件文件的时间戳,而不是校验和文件。
就我的本地 Nexus 存储库而言,我拥有该工件的最新版本(2010 年 3 月 29 日),因此无需重新下载任何内容。
我注意到我的 Nexus 版本很旧(1.5 与 1.9.1),所以我会尝试更新,看看新版本在缓存过期方面是否做得更好。如果没有,我可能会看看 Sonatype 人的想法(也许这是一个错误?)。
最佳答案
不,您面临的是 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 和校验和文件(通过使用空的/nuked 本地存储库)
希望这能解释你写的一些东西。
引用JIRA issue discussing same thing .
关于maven-2 - 如何修复 Nexus 存储库中不正确的校验和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5751572/