在 Maven 中,dependencyManagement 和 dependency 都用于管理项目依赖,但它们的作用和使用场景有明显区别:
1. dependency(依赖声明)
- 作用:直接声明项目需要引入的依赖,Maven 会实际下载并添加到项目的类路径中。
- 特点:
- 声明即引入,会被当前项目及子项目(如果是父 POM)继承
- 必须指定
groupId、artifactId,通常还需要version - 可以通过
scope指定依赖范围(如compile、test等)
- 示例:
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.1-jre</version>
<scope>compile</scope>
</dependency>
</dependencies>
2. dependencyManagement(依赖管理)
- 作用:声明依赖的版本、范围等信息,但不会实际引入依赖,仅作为依赖版本的管理中心。
- 特点:
- 仅声明依赖信息,不实际下载依赖
- 主要用于统一管理项目(尤其是多模块项目)中依赖的版本,避免版本冲突
- 子项目可以直接引用父项目中
dependencyManagement声明的依赖,无需指定版本
- 示例:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.1-jre</version>
<scope>compile</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 子项目或当前项目中实际引入时,无需指定版本 -->
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<!-- 版本已在 dependencyManagement 中声明 -->
</dependency>
</dependencies>
核心区别总结
| 特性 | dependency | dependencyManagement |
|---|---|---|
| 实际引入依赖 | 是 | 否 |
| 版本管理 | 单个依赖的版本声明 | 统一管理多个依赖的版本 |
| 继承特性 | 子项目会继承依赖 | 子项目可引用但需显式声明 |
| 主要用途 | 实际添加项目所需依赖 | 统一控制依赖版本,避免冲突 |
最佳实践
- 在多模块项目中,通常在父 POM 的
dependencyManagement中统一声明所有依赖的版本 - 子模块通过
dependency引入所需依赖,无需重复指定版本 - 这样既能保证项目中依赖版本的一致性,又能灵活控制每个模块实际引入的依赖
Maven依赖管理与声明区别
511

被折叠的 条评论
为什么被折叠?



