dependencyManagement和dependencies都是Maven中的依赖,它们相互关联但又各司其职.共同实现项目的依赖管理:
-
版本控制与实际引入的关系
dependencyManagement是 "版本管理器",仅负责定义依赖的版本、范围等元信息,但不会实际引入依赖到项目中。dependencies是 "依赖执行者",负责声明项目真正需要的依赖,会实际下载并引入依赖到构建中。- 当
dependencies中声明的依赖在dependencyManagement中有对应配置时,可以省略version等信息,自动继承dependencyManagement中定义的版本。
-
优先级关系
- 如果
dependencies中显式指定了依赖的version,则会覆盖dependencyManagement中定义的版本。 - 如果
dependencies中未指定version,则会继承dependencyManagement中对应的版本(前提是存在相同groupId和artifactId的配置)。
- 如果
-
使用场景的配合
-
通常在父 POM 中用
dependencyManagement统一管理项目中所有模块可能用到的依赖版本,避免版本混乱。 -
子模块在
dependencies中只需声明所需依赖的groupId和artifactId,无需重复写版本,实现 "一处配置,多处复用"。
-
举例说明它们的协作:
父 POM 中定义版本管理:
xml
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.7.0</version> <!-- 统一版本 -->
</dependency>
</dependencies>
</dependencyManagement>
子模块中实际引入依赖(无需写版本):
xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 自动使用父模块中定义的2.7.0版本 -->
</dependency>
</dependencies>
这种机制的好处是:
- 集中管理版本,避免版本冲突
- 简化子模块的依赖声明
- 便于统一升级依赖版本
总结:dependencyManagement 为 dependencies 提供 "版本基准",dependencies 则基于这个基准实现依赖的实际引入,二者结合既保证了版本统一性,又灵活支持具体依赖的按需引入。