在 Maven 中,<dependencyManagement> 和 <dependencies> 都是用于管理项目依赖的标签,但它们的作用和使用场景有本质区别,核心差异在于是否实际引入依赖以及版本控制的范围。
1. <dependencies>:实际引入依赖
<dependencies> 标签用于直接声明项目运行或编译时需要的依赖,声明后 Maven 会自动下载并将这些依赖引入到项目的类路径中(即实际生效)。
特点:
- 声明的依赖会被当前项目直接使用,且会传递给子项目(除非通过
<scope>限制传递性)。 - 若未指定版本,Maven 会尝试从父工程或
dependencyManagement中继承版本;若未找到,会报错。
2. <dependencyManagement>:统一管理依赖版本
<dependencyManagement> 标签用于集中声明依赖的版本、scope 等信息,但不会实际引入依赖。它的核心作用是 “版本管控”,确保项目(及子项目)中同一依赖的版本统一,避免版本冲突。
特点:
- 仅声明依赖的元数据(版本、scope 等),不实际下载或引入依赖,需在
<dependencies>中显式声明后才会生效。 - 子项目可以继承父项目
dependencyManagement中定义的版本,无需重复指定版本,便于统一维护。 - 若子项目在
<dependencies>中声明依赖时指定了版本,会覆盖dependencyManagement中的版本(优先级更高)。
3、最佳实践
- 在父工程中使用
<dependencyManagement>:集中管理所有子项目可能用到的依赖版本,确保版本统一。 - 在子工程中使用
<dependencies>:仅声明当前项目需要的依赖,版本从父工程的dependencyManagement继承,减少重复配置。 - 避免在
dependencyManagement中声明不必要的依赖:仅管理项目中确实会用到的依赖,保持配置简洁。
通过两者配合,可以高效管理 Maven 项目的依赖,减少版本冲突,提高维护性。