当前位置: 首页 > 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.lryc.cn/news/577238.html

相关文章:

  • 基于C++实现 bp 神经网络的手写数字识别
  • 【LeetCode 热题 100】239. 滑动窗口最大值——(解法一)滑动窗口+暴力解
  • 从0开始学习计算机视觉--Day06--反向传播算法
  • 【FR801xH】富芮坤FR801xH之PMU GPIO
  • Stable Diffusion 项目实战落地:从0到1 掌握ControlNet 第三篇: 打造光影字形的创意秘技-文字与自然共舞
  • [面试] js手写题-树转数组
  • 文心大模型 4.5 系列开源首发:技术深度解析与应用指南
  • uni-app使用uview2自定义tabber
  • PHP 全面解析:从入门到实践的服务器端脚本语言
  • 计算机网络中那些常见的路径搜索算法(一)——DFS、BFS、Dijkstra
  • Qt Quick 与 QML(四)qml中的Delegate系列委托组件
  • Python I/O 库 包 iopath
  • ExGeo代码理解(七)main.py(运行模型进行训练和测试)
  • 生成式人工智能实战 | 变分自编码器(Variational Auto-Encoder, VAE)
  • 如何让Excel自动帮我们算加减乘除?
  • PHP语法基础篇(七):函数
  • 电脑开机加速工具,优化启动项管理
  • 深入比较 Gin 与 Beego:Go Web 框架的两大选择
  • 深度学习04 卷积神经网络CNN
  • 国科大深度学习作业2-基于 ViT 的 CIFAR10 图像分类
  • 工业级PHP任务管理系统开发:模块化设计与性能调优实践
  • DBeaver 设置阿里云中央仓库地址的操作步骤
  • 提示技术系列——链式提示
  • 数据结构入门-图的基本概念与存储结构
  • 【软考高项论文】论信息系统项目的干系人管理
  • 利用不坑盒子的Copilot,快速排值班表
  • upload-labs靶场通关详解:第15-16关
  • docker-compose部署Nacos、Seata、MySQL
  • 《Effective Python》第十一章 性能——使用 timeit 微基准测试优化性能关键代码
  • 初始CNN(卷积神经网络)