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

标签 java maven

考虑使用 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/

相关文章:

java - 在Java中从文件中读取数字/整数

java - 如何从虚拟 IP 地址向服务器发送请求?

java - Artifact 丢失 : org. hibernate :hibernate-entitymanager:jar:3. 3.2.ga

java - 如果元素不为空,则使用 lambda 过滤器,否则忽略过滤器

java - 二维平面上的重叠多边形

java - Spring boot war 在 Jboss 7.1 上不起作用

java - 关闭三叶草覆盖范围 - 不起作用

java - 如何将库(不可编辑的.java/.class文件)转换为可编辑的.java文件(项目中的标准类)?

maven - Apache Hadoop 2.6.0 源代码编译问题

java - 泛型和数组