Maven 依赖调解

Maven 依赖调解(Dependency Mediation)是指当项目中引入的多个依赖中存在相同的依赖(同一个 groupId 和 artifactId),但是版本不同,这时 Maven 会自动选择一个版本,这个过程就是依赖调解。

举个例子,假设我们的项目中引入了以下两个依赖:

<dependency>
  <groupId>com.example</groupId>
  <artifactId>foo</artifactId>
  <version>1.0.0</version>
</dependency>

<dependency>
  <groupId>com.example</groupId>
  <artifactId>bar</artifactId>
  <version>2.0.0</version>
  <scope>compile</scope>
  <exclusions>
    <exclusion>
      <groupId>com.example</groupId>
      <artifactId>foo</artifactId>
    </exclusion>
  </exclusions>
</dependency>

这里我们引入了 com.example:foo:1.0.0 和 com.example:bar:2.0.0 两个依赖,它们都依赖于 com.example:baz:1.0.0 这个库。但是,foo 依赖于 baz 的版本是 1.0.0,而 bar 依赖于 baz 的版本是 2.0.0。

在这种情况下,Maven 会根据一定的规则选择一个版本来解决依赖冲突。这个规则如下:

首先,如果依赖已经被直接声明在项目的 pom.xml 文件中,那么使用该版本。
如果不是第一种情况,则使用最近的依赖版本。最近的依赖版本是指,从根节点到当前节点所经过的路径上最近的一个依赖节点的版本。
如果还有多个版本可供选择,则使用最高版本。
根据上面的规则,Maven 会选择 com.example:baz:2.0.0 作为 bar 的依赖版本。这个依赖调解的过程对于我们来说是透明的,我们不需要手动干预依赖版本的选择。但是,有时候依赖调解可能会导致问题,比如说不同版本的依赖库之间存在不兼容的改动。这时候我们需要手动指定依赖版本,或者使用 Maven 提供的 标签来解决依赖冲突。