Maven 依赖管理
1. 核心概念解析
1.1 dependencyManagement
- 作用 :仅用于统一管理依赖的版本号,不直接引入依赖。
- 使用场景:多模块项目中,父 POM 统一管理子模块依赖版本,避免冲突和重复配置。
- 特点 :
- 子模块需显式在
<dependencies>
中声明依赖(无需版本号)才能生效。 - 可覆盖父 POM 的版本(子模块手动指定版本)。
- 子模块需显式在
1.2 dependencies
- 作用 :直接引入依赖 ,依赖会自动下载并加入构建路径(如
classpath
)。 - 特点 :
- 若未指定版本号,Maven 会尝试解析最新版本(可能导致不一致)。
- 单模块项目通常直接在此声明依赖。
2. 是否需要同时写在 dependencyManagement
和 dependencies
?
场景 | 操作方式 | 示例 |
---|---|---|
父 POM 统一管理版本 | 1. 父 POM 在 <dependencyManagement> 声明版本 2. 子模块在 <dependencies> 声明依赖(无需版本号) |
xml
<!-- 父 POM -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.10</version>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 子模块 -->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<!-- 无需版本号 -->
</dependency>
</dependencies>
|
| 直接引入依赖 | 仅在 <dependencies>
声明依赖(需指定版本号) |
xml
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
</dependencies>
|
| 覆盖父 POM 版本 | 子模块在 <dependencies>
中显式指定新版本 |
xml
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.20</version> <!-- 覆盖父 POM 版本 -->
</dependency>
</dependencies>
|
3. 总结对比表
场景 | 是否需要写在 dependencyManagement ? |
是否需要写在 dependencies ? |
---|---|---|
父 POM 统一管理版本 | ✅ 是(声明版本) | 子模块 ✅ 是(无需版本号) |
直接引入依赖 | ❌ 否 | ✅ 是(需指定版本号) |
覆盖父 POM 版本 | ❌ 否 | ✅ 是(需显式指定新版本) |
4. 最佳实践
- 多模块项目 :
- 父 POM 使用
<dependencyManagement>
统一版本。 - 子模块在
<dependencies>
中声明依赖(无需版本号)。
- 父 POM 使用
- 单模块项目 :
- 直接在
<dependencies>
中声明依赖(需版本号)。
- 直接在
- 避免版本冲突 :
- 通过
<dependencyManagement>
统一版本,确保依赖一致性。
- 通过
- 灵活覆盖 :
- 子模块可通过
<dependencies>
覆盖父 POM 的版本。
- 子模块可通过
5. 示例代码
父 POM(管理版本)
xml
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.10</version>
</dependency>
</dependencies>
</dependencyManagement>
子模块(引入依赖)
xml
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<!-- 自动继承父 POM 的版本 -->
</dependency>
</dependencies>
6. 注意事项
- 版本优先级 :子模块在
<dependencies>
中显式指定的版本会覆盖父 POM 的<dependencyManagement>
。 - 避免冗余 :若依赖版本无需统一管理,无需写入
<dependencyManagement>
。 - 作用范围 :
<dependencyManagement>
仅管理版本,依赖仍需在<dependencies>
中声明才能使用。