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 提供的 标签来解决依赖冲突。