在 Maven 项目中,当 A 项目依赖了 B 组件,而 B 组件也依赖了 mybatis-plus-generator 但版本不同(A: 3.5,B: 3.6),最终 A 项目会使用的 mybatis-plus-generator 版本取决于 Maven 的依赖解析规则。
🔍 Maven 依赖解析规则
Maven 解析依赖版本时,采用 最近依赖优先(Nearest Wins) 原则:
- 直接依赖优先级高:如果 A 项目在
pom.xml直接声明了mybatis-plus-generator版本(如 3.5),那么 A 仍然会使用 3.5,即使 B 组件使用的是 3.6。 - 间接依赖继承:如果 A 没有直接声明
mybatis-plus-generator版本,而 B 依赖了 3.6,那么 A 项目会使用 3.6。 - 依赖管理 (
dependencyManagement):如果 A 项目中dependencyManagement指定了mybatis-plus-generator版本(如 3.5),则 所有子依赖(包括 B)都会强制使用 3.5。
🛠 如何确定最终使用的版本?
你可以在 A 项目根目录执行以下命令:
mvn dependency:tree
会输出类似的依赖关系:
[INFO] com.example:A:1.0
[INFO] ├── com.example:B:1.0
[INFO] │ └── com.baomidou:mybatis-plus-generator:3.6
[INFO] └── com.baomidou:mybatis-plus-generator:3.5 (omitted for conflict)
这里 omitted for conflict 表示 Maven 最终采用的是 3.6。
📌 解决方案
✅ 强制使用 A 项目的 3.5 版本
如果你想让 A 项目始终使用 mybatis-plus-generator 3.5,可以在 A 项目的 pom.xml 里显式声明:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5</version>
</dependency>
✅ 在 dependencyManagement 里锁定版本
如果 A 项目是一个父项目,且有多个子模块或依赖了多个版本,可以在 dependencyManagement 中指定版本:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5</version>
</dependency>
</dependencies>
</dependencyManagement>
这样 所有模块(包括 B 组件)都会使用 3.5 版本。
📌 结论
| 情况 | 最终使用的 mybatis-plus-generator 版本 |
|---|---|
| A 直接声明 3.5 | 3.5 |
| A 没有声明,B 依赖 3.6 | 3.6 |
A 在 dependencyManagement 锁定 3.5 | 3.5 |
你可以执行 mvn dependency:tree 进一步确认实际的版本。 🚀