当前位置: 首页 > news >正文

Maven 中,dependencies 和 dependencyManagement

在 Maven 中,dependencies 和 dependencyManagement 是两个不同的配置部分,它们在依赖管理和项目构建中扮演不同的角色。以下是它们的详细对比:


1. dependencies(直接依赖)

作用

  • 直接声明项目当前模块需要使用的依赖项。
  • 这些依赖会被自动下载并包含在项目的构建路径(如 classpath)中。
  • 子模块(如果使用父 POM)不会自动继承这些依赖(除非显式声明)。

特点

  • 自动引入:依赖会被直接添加到当前模块的构建中。
  • 版本强制:如果未指定版本,Maven 会尝试从仓库解析最新版本(可能导致不一致)。
  • 传递性依赖:依赖的依赖(transitive dependencies)也会被自动引入。

示例

<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.3.10</version> <!-- 必须指定版本 --></dependency>
</dependencies>
适用场景
  • 当前模块确实需要使用的库(如 Spring Core、JUnit 等)。
  • 需要显式控制依赖版本的情况。

2. dependencyManagement(依赖管理)

作用

  • 集中管理依赖版本,但不直接引入依赖。
  • 子模块可以继承这些版本定义,只需声明 groupId 和 artifactId 即可使用管理版本。
  • 避免在多个模块中重复指定相同版本,确保版本一致性。

特点

  • 不自动引入依赖:仅管理版本,不会将依赖添加到构建路径。
  • 版本统一:子模块可以省略版本号,使用父 POM 管理的版本。
  • 覆盖机制:子模块可以显式覆盖父 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><!-- 不需要版本号,使用父 POM 管理的版本 --></dependency>
</dependencies>
适用场景
  • 多模块项目中统一管理依赖版本。
  • 避免版本冲突,确保所有模块使用相同版本的库。
  • 需要灵活覆盖版本的情况(如测试环境使用不同版本)。

3. 核心对比

特性dependenciesdependencyManagement
是否直接引入依赖✅ 是(自动添加到构建路径)❌ 否(仅管理版本)
子模块是否继承❌ 否(除非显式声明)✅ 是(可省略版本号)
版本控制每个模块独立指定版本集中管理版本,避免重复
传递性依赖自动引入不影响传递性依赖
典型用途当前模块直接使用的依赖多模块项目的版本统一管理

4. 最佳实践

  1. 多模块项目
    • 在父 POM 中使用 dependencyManagement 统一管理版本。
    • 子模块仅声明 dependencies,省略版本号。
  2. 避免版本冲突
    • 使用 dependencyManagement 确保所有模块使用相同版本的库。
  3. 灵活覆盖
    • 子模块可以显式指定版本,覆盖父 POM 的管理版本。
  4. BOM(Bill of Materials)
    • 可以引入第三方 BOM(如 Spring Boot、Hibernate)来管理版本:
      <dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.5.0</version><type>pom</type><scope>import</scope></dependency></dependencies>
      </dependencyManagement>
       

5. 总结

  • dependencies:直接引入依赖,适用于当前模块确实需要的库。
  • dependencyManagement:仅管理版本,适用于多模块项目的版本统一。

推荐做法

  • 在父 POM 中使用 dependencyManagement 集中管理版本。
  • 在子模块中使用 dependencies 声明实际依赖(省略版本号)。
  • 避免在多个模块中重复指定相同版本,减少维护成本。
http://www.dtcms.com/a/263114.html

相关文章:

  • 临床试验中基线数据缺失的处理策略
  • synetworkflowopenrestydpdk
  • Spring Boot + ONNX Runtime模型部署
  • 6阶段实现最强RAG 模块化检索增强 实践指南
  • [springboot系列] 探秘JUnit 5: Java单元测试利器
  • Redis 和 Mysql 如何保证数据一致性
  • 底盘结构---履带式运动模型
  • 快速手搓一个MCP服务指南(八):FastMCP 代理服务器:构建灵活的 MCP 服务中介层
  • HTML<input>元素详解
  • 《用奥卡姆剃刀原理,为前端开发“减负增效”》
  • 《微信生态裂变增长利器:推客小程序架构设计与商业落地》
  • python训练day45 Tensorborad使用介绍
  • Linux 日志监控工具对比:从 syslog 到 ELK 实战指南
  • 阶段二开始-第一章—8天Python从入门到精通【itheima】-121节+122节(函数和方法的类型注解+Union联合类型注解)
  • 【运维系列】【ubuntu22.04】安装GitLab
  • 2025年光学工程、精密仪器与光电子技术国际会议(OEPIOT 2025)
  • Armbian 25.5.1 Noble Gnome 开启远程桌面功能
  • 百度文心ERNIE 4.5 大模型系列正式开源
  • Windows 安装 nodejs npm
  • 数据生命周期管理实战:建、用、管、存、归档到销毁的全流程治理
  • 如何用废弃电脑变成服务器搭建web网站(公网访问零成本)
  • 24V转12V降压实际输出12.11V可行性分析
  • GitHub Actions配置python flake8和black
  • 云手机的用途都有哪些?
  • 51c大模型~合集144
  • 赋能低压分布式光伏“四可”建设,筑牢电网安全新防线
  • Java垃圾回收机制和三色标记算法
  • MySQL EXPLAIN 关键字详解
  • python学习打卡day58
  • 使用 C++ 和 OpenCV 构建驾驶员疲劳检测软件