考虑使用 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>
- 我如何检测这个问题(我只是发现这个问题,因为 kafka 会失败并告诉你它需要一个特定的 jackson )。我的想法是编写一个脚本/插件,将 dependency:tree 与“黄金”副本进行比较,如果它们不同,则失败,至少让人们在修改
dependencyManagement
时仔细检查他们的更改
- 如何从
dependencyManagement
中排除依赖项?我已经使用正常的依赖项完成了此操作,并且dependencyManagement
存在相同的排除标记,但我尝试的任何方法都不起作用。我假设排除在您实际使用依赖项时生效,但我也认为该版本仅在您实际使用依赖项时才会生效,但该假设似乎是错误的。 - 因为我无法排除它,所以我可以通过上面的方法强制版本,但为什么它在
dependencyManagement
中时无论顺序如何都可以工作,这与正常中的顺序很重要不同依赖
标签?
最佳答案
首先,BOM 会覆盖传递依赖项。如果某个依赖项出现在依赖项树中并且 BOM 为其指定了一个版本,则该版本获胜,除非:
- 您自己使用不同的版本定义了依赖项。
- 您自己添加了一个 dependencyManagement 条目,覆盖了 BOM 中的值。
当然,如果 BOM 重叠,则只有一个可以获胜。
因此,如果您将 jackson-databind
作为传递依赖项,并且您有一个包含它的 BOM,那么您可以从 BOM 中获取版本。除非您自己创建一个覆盖 BOM 的 dependencyManagement 条目。
关于java - Maven - 从 DependencyManagement 中排除传递依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59914927/