gpt4 book ai didi

java - Maven - 从 DependencyManagement 中排除传递依赖

转载 作者:行者123 更新时间:2023-12-01 18:41:59 24 4
gpt4 key购买 nike

考虑使用 maven 3.6.2 遵循 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>

<artifactId>foo</artifactId>
<groupId>bar</groupId>
<version>1.0.0</version>

<dependencies>
<!-- #1
<dependency>
<groupId>org.jdbi</groupId>
<artifactId>jdbi3-jackson2</artifactId>
<version>3.12.0</version>
</dependency>
-->
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka_2.12</artifactId>
<version>2.4.0</version>
<scope>compile</scope>
</dependency>
<!-- #2
<dependency>
<groupId>org.jdbi</groupId>
<artifactId>jdbi3-jackson2</artifactId>
<version>3.12.0</version>
</dependency>
-->
</dependencies>

<!-- #3
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.jdbi</groupId>
<artifactId>jdbi3-bom</artifactId>
<type>pom</type>
<version>3.12.0</version>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
-->

<properties>
<maven.compiler.target>11</maven.compiler.target>
<maven.compiler.source>11</maven.compiler.source>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
</project>

如果你运行mvn dependency:tree | grep databind 你应该看到:

[INFO]    +- com.fasterxml.jackson.core:jackson-databind:jar:2.10.0:compile

这是基线,并确定 kafka_2.12 使用 jackson-databind:2.10.0

如果您仅取消注释 #1 并重新运行,那么您应该看到:

[INFO] |  +- com.fasterxml.jackson.core:jackson-databind:jar:2.9.9.3:compile

这对我来说很有意义,并告诉我 jdbi3-jackson2 使用 jackson-databind:2.9.9.3 并且使用此版本是因为它出现在之前 kafka_2.12

如果您仅取消注释 #2 并重新运行,那么您应该看到:

[INFO] |  +- com.fasterxml.jackson.core:jackson-databind:jar:2.10.0:compile

这对我来说也很有意义,因为 jdbi3-jackson2 现在出现在 kafka_2.12

之后

如果您仅取消注释 #3 并重新运行,那么您应该看到:

[INFO]    +- com.fasterxml.jackson.core:jackson-databind:jar:2.9.9.3:compile

我期望 2.10.0 因为我没有使用 bom 中的任何内容(特别是 jdbi3-jackson2)

基于几乎每个人都说的关于 bom 的所有内容,我认为它们的版本信息只会在 bom 中应用依赖项时使用

此外,如果我在 dependencyManagement 中添加以下任何地方,那么它会返回到 2.10.0:

  <dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.0</version>
</dependency>
  1. 我如何检测这个问题(我只是发现这个问题,因为 kafka 会失败并告诉你它需要一个特定的 jackson )。我的想法是编写一个脚本/插件,将 dependency:tree 与“黄金”副本进行比较,如果它们不同,则失败,至少让人们在修改 dependencyManagement
  2. 时仔细检查他们的更改
  3. 如何从 dependencyManagement 中排除依赖项?我已经使用正常的依赖项完成了此操作,并且 dependencyManagement 存在相同的排除标记,但我尝试的任何方法都不起作用。我假设排除在您实际使用依赖项时生效,但我也认为该版本仅在您实际使用依赖项时才会生效,但该假设似乎是错误的。
  4. 因为我无法排除它,所以我可以通过上面的方法强制版本,但为什么它在 dependencyManagement 中时无论顺序如何都可以工作,这与正常 中的顺序很重要不同依赖标签?

最佳答案

首先,BOM 会覆盖传递依赖项。如果某个依赖项出现在依赖项树中并且 BOM 为其指定了一个版本,则该版本获胜,除非:

  • 您自己使用不同的版本定义了依赖项。
  • 您自己添加了一个 dependencyManagement 条目,覆盖了 BOM 中的值。

当然,如果 BOM 重叠,则只有一个可以获胜。

因此,如果您将 jackson-databind 作为传递依赖项,并且您有一个包含它的 BOM,那么您可以从 BOM 中获取版本。除非您自己创建一个覆盖 BOM 的 dependencyManagement 条目。

关于java - Maven - 从 DependencyManagement 中排除传递依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59914927/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com