为什么在maven中使用dependencyManagement通常不会出问题?

Why does the use of dependencyManagement in maven usually not lead to problems?

我知道 Maven 中的 dependencyManagement 在避免子 poms 中的不同版本的依赖项以及使用一个(且仅一个)版本的依赖项方面给您带来了很大的好处。

与此同时,我很难理解为什么通过 dependencyManagement 覆盖传递依赖是一件安全的事情。 假设我们有一个依赖项 D,它被设置为带有 dependencyManagement 的 2.0 版。 另一个依赖项 - C - 也使用 D,尽管它依赖于 1.0 版中的 D。 使用 dependencyManagement,我将此传递依赖设置为 2.0。 这不危险吗?毕竟,C 依赖于 API 和 1.0 版的实现 - 如果在 D[ 的 1.0 版和 2.0 版之间进行了重大更改怎么办? =20=]?

这样做并不安全。

它可能会导致您描述的问题。

但是因为你不能有一个以上的依赖版本(至少,不是没有阴影),你需要选择一个或者让 Maven 决定。后者在大多数情况下比自己挑选一个合理的版本更危险。

之所以有效,是因为 D 2.0 向后兼容。 所以 D 2.0 提供了所有 API,功能与 D 1.0 一样,因此 C 可以使用它。

如果 D 2.0 向后兼容,那么你有冲突。您可能需要升级 C,或找到较低版本的 D,您的所有依赖项都可以愉快地依赖它。

您可以使用 mvn dependency:tree 来解决上述冲突 here