考虑使用Maven pom.xml
跟随3.6.2
<?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>
dependencyManagement
dependencyManagement
中排除依赖项?我已经完成了正常的依赖关系,并且为dependencyManagement
存在相同的exclusions标记,但是我没有任何尝试。我认为排除在您实际使用依赖项时生效,但我也认为该版本也将在您实际使用依赖项时生效,但这种假设似乎是错误的。dependencyManagement
中使用时不管其顺序如何,与常规dependencies
标签中的顺序很重要?答案 0 :(得分:0)
首先,BOM会覆盖传递依赖关系。如果某个依赖项出现在依赖项树中,并且BOM表为其指定了一个版本,则该版本将获胜,除非:
当然,如果BOM重叠,那么只有一个可以获胜。
因此,如果您将jackson-databind
作为传递依赖项,并且具有包含它的BOM表,则可以从BOM表获取版本。除非您自己创建一个覆盖BOM的dependencyManagement条目。
答案 1 :(得分:0)
对于#1。我建议使用maven-enforcer-plugin
对于#2。您只能排除直接传递依赖项。
对于#3。该算法基于最接近的定义进行决策,这意味着依赖将与您的项目越接近,它将被选择。