1. 概述

在本教程中,我们将学习如何在本地Maven存储库损坏时强制更新它。为了实现这一点,我们将使用一个简单的示例来演示为什么存储库可能会损坏以及如何修复它。

2. 前提条件

要学习和运行本教程中的命令,我们需要使用Spring Initializr项目,并安装 JDK 和 Maven。

3.Maven仓库结构

Maven将项目的所有依赖项保存在 .m2 文件夹中。例如,在下图中,我们可以观察Maven 存储库的结构:

平方米

我们可以看到,Maven 下载了 存储库 文件夹下的所有依赖项。因此,需要下载到本地存储库才能在运行时访问所有需要的代码。

4.下载 依赖项

我们知道Maven是基于 pom.xml 文件配置工作的。 当 Maven 执行这个 pom.xml 文件时,将从中央 Maven 存储库下载依赖项并将其放入我们本地的 Maven 存储库 中。如果我们的本地存储库中已有依赖项,Maven 将不会下载它们。

当我们执行以下命令时就会发生下载:

mvn package
mvn install

上述两者都包括执行以下命令:

mvn dependency:resolve 

因此,我们可以仅通过运行 dependency:resolve 命令来解决依赖关系,而无需使用包或安装。

5. 依赖 关系 损坏

下载依赖项时,可能会发生网络故障,导致依赖项损坏。中断的依赖项下载是损坏的主要原因。 Maven 将相应地显示一条消息:

Could not resolve dependencies for project ...

接下来让我们看看如何解决这个问题。

6. 自动修复损坏的依赖项

当 Maven 通知我们构建失败时,通常会显示损坏的依赖项:

Could not transfer artifact [artifact-name-here] ...

为了解决这个问题,我们有自动或手动的方法。此外,我们应该在调试模式下运行任何存储库更新,在 -U 之后添加 -X 选项,以便更好地了解更新期间发生的情况。

6.1.强制更新所有快照依赖项

我们已经知道,Maven 不会再次下载现有的依赖项。因此,要强制 Maven 更新所有损坏的 SNAPSHOT 依赖项,我们应该在命令中添加 -U/–update-snapshots 选项:

mvn package -U
mvn install -U

不过,我们必须记住, 如果 Maven 已经下载了 SNAPSHOT 依赖项并且校验和相同,则该选项不会重新下载该依赖项。

接下来这也将打包或安装我们的项目。最后,我们将学习如何在不包含当前工作项目的情况下更新存储库。

6.2.依赖性解决目标

我们可以告诉 Maven 解决我们的依赖关系并更新快照,而无需任何包或安装命令。为此,我们将通过包含 -U 选项来使用 dependency:resolve 目标:

mvn dependency:resolve -U

6.3.清除本地存储库目标

我们知道 -U 只是重新下载损坏的 SNAPSHOT 依赖项。因此,在本地发布依赖项损坏的情况下,我们可能需要更深入的命令。为此,我们应该使用:

mvn dependency:purge-local-repository

dependency:purge-local-repository 的目的是从本地 Maven 存储库中清除(删除并可选地重新解析)工件。默认情况下,工件将被重新解析。

6.4.清除本地存储库选项

可以将清除本地存储库配置为仅针对特定组的依赖项运行,方法是为 resolutionFuzziness 选项指定“ groupId” ,并使用 include 选项指定要搜索的确切组 ID:

mvn dependency:purge-local-repository -Dinclude:org.slf4j -DresolutionFuzziness=groupId -Dverbose

resolutionFuzziness 选项可以具有以下值: versionartifactIdgroupIdfile

上面的示例将搜索并清除 org.slf4j 组中的所有工件。我们还设置了 详细 选项,以便我们可以查看已删除工件的详细日志。

如果找到任何符合条件的文件,日志将显示如下文本:

Deleting 2 transitive dependencies for project [...] with artifact groupId resolution fuzziness
[INFO] Purging artifact: org.slf4j:jul-to-slf4j:jar:1.7.31
Purging artifact: org.slf4j:slf4j-api:jar:1.7.31 

请注意, 要指定包含或排除以进行删除或刷新的工件,我们可以使用选项 包含/排除:

mvn dependency:purge-local-repository -Dinclude=com.yyy.projectA:projectB -Dexclude=com.yyy.projectA:projectC

7. 手动删除存储库

尽管 -U 选项和 purge-local-repository 可能会解决损坏的依赖项而无需刷新所有依赖项,但手动删除 . m2 本地存储库将导致强制重新下载所有依赖项。

当我们有旧的且可能损坏的依赖项时,这可能很有用。然后简单的重新打包或重新安装就可以完成任务。此外,我们可以使用 dependency:resolve 选项来单独解决项目的依赖关系。

八、结论

在本文中,我们讨论了 Maven 强制更新本地存储库的选项和目标。

使用的示例是简单的 Maven 命令,可以在配置了正确的 pom.xml 的任何项目上使用。