确保 Maven 中的依赖版本一致

Ensuring consistent dependencies version in Maven

在我的项目中,我有模块 M1,它使用库 A。此库依赖于库 B.

并且在另一个模块中 M2 我想使用库 B

当然,我有 "root" 模块,它依赖于我所有的模块,所以库 B 的版本在所有项目中应该是相同的。

所以我将 B 添加到我的 M2 模块的依赖项中,但不知道如何指定它的版本,因为我需要与库 A 使用的完全相同的版本。

如果我指定库 B 的当前版本,那么当我将库 A 升级到新版本时,我将忘记更新模块中 B 的版本。

我也不想将 A 作为 M2 的依赖项,因为我只需要它的有限部分功能。

我的案例的最佳做法是什么?

如果版本不同,maven enforce 插件可以中断构建,因此您不要忘记更新:参见 https://maven.apache.org/enforcer/enforcer-rules/dependencyConvergence.html

有几个选项,其中一些您明确排除。为了完整起见,让我提一下它们:

  1. B 作为依赖项包含在 M2 中。

    • 优点:关于仅向 M2 添加实际需要的那些功能的最干净的解决方案。
    • 缺点M2B的版本必须与AB的版本保持同步手动。
  2. A 作为依赖项包含在 M2 中。

    • 优点:Central <DependencyManagement> 可以在你的父 POM 中使用。因此,B 的版本在所有子项目中将始终相同。
    • 缺点M2 中不需要的 A 功能已添加到 M2
  3. M1 作为依赖项包含在 M2 中。

    • 优点M2 总是使用与 A 相同版本的 B,而无需处理 B 作为完全依赖。
    • 缺点M2 中不需要的 M1A 的功能已添加到 M2
  4. 使用<dependency>/.../<exclusion>M1中的A中排除B

    • 优点:Central <DependencyManagement> 可以在你的父 POM 中使用。因此,B 的版本在所有子项目中将始终相同。
    • 缺点B 的版本必须手动与 A 中的 B 的版本保持同步。

[如果还有什么我没有想到的,欢迎输入。]

尝试Maven Enforcer Plugin's Dependency Convergence mentioned by 。如果它适用于直接依赖和传递依赖的混合,就像你的情况一样,我会将它与 1.

结合使用