【问题标题】:How to ensure I am not including duplicate transitive dependencies through two maven dependencies?如何确保我没有通过两个 Maven 依赖项包含重复的传递依赖项?
【发布时间】:2021-09-06 15:19:03
【问题描述】:

我正在寻找一种方法来测试我的 pom.xml 引用中的任何显式依赖项是否包含任何相同的传递依赖项。例如,如果dependency-A 包括junit.jupiter 并且dependency-B 还包括junit.jupiter,我想要一种方法来查看它,以便我可以从其中一个中排除它以防止冲突。

我通过this link 看到您可以使用mvn dependency:tree 基本上显示所有依赖项及其传递依赖项,但它以相当不可读的格式打印,并且通过该输出不清楚每个传递依赖项的来源是。

【问题讨论】:

  • 这不是惯例。
  • 传递依赖将被合并,而不是重复。为什么要排除一个?
  • maven-dependency-plugin的输出格式可以随意更改
  • @pascal 如果两个依赖项 A 和 B 都依赖于 junit.jupiter 的不同版本,那是我想排除他们引入的 junit.jupiter 之一。注意我会想要排除其中之一的 junit.jupiter 依赖关系,而不是完全排除依赖项-A 或依赖项-B。因为否则会出现版本不匹配/冲突

标签: java maven pom.xml


【解决方案1】:

请注意,如果依赖项-A 使用junit.jupiter 而依赖项-B 使用junit.jupiter,则只会包含其中一个依赖项。 Maven 不会两次包含相同的依赖项。

不过,最终的版本可能会比较棘手。 Maven 采用“最近”元素,而不是最高版本。如果您想注意是否有冲突的版本,我建议使用 maven 强制执行规则的“依赖收敛”规则。

如果您想为junit.jupiter 选择一个版本,请在您的 POM 中为<dependencyManagement> 添加一个条目。

【讨论】:

  • 澄清一下,你是说如果 depedency-A 具有 junit.jupiter 的传递依赖,并且依赖 B 也具有 junit.jupiter 的传递依赖,那么 maven 将基本上完全忽略依赖-A 或依赖-B,即使它们包含我的应用程序需要运行的关键其他组件?还是 maven 会忽略其中一个的 junit.jupiter 部分?
  • 它不会忽略整个依赖,而是对junit.jupiter的传递依赖
猜你喜欢
  • 1970-01-01
  • 2016-02-23
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-06
相关资源
最近更新 更多