dependencies标签和dependencyManagement标签区别

本文深入解析Maven中dependencies与dependencyManagement的区别,详细说明了依赖包的版本号判断途径及子项目如何继承依赖。

直观区别

  • dependencies中的依赖都会被自动引用
  • dependencyManagement只是声明依赖的版本号,并不会引用该依赖

dependencies

dependencyManagement

项目中依赖包版本号判断途径

  • 若 dependencies 里的 dependency 自己没有声明 version 元素,那么maven 就会 到 dependencyManagement 里去找有没有该 artifactId 和 groupId 进行过版本声明,若存在,则继承它,若没有则报错,你必须为dependency声明一个version
  • 若 dependencies 中的 dependency 声明了version,则 dependencyManagement 中的声明无效

区别

  • 所有声明在dependencies 里的依赖都会自动引入,并默认被所有的子项目继承
  • dependencies 即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)
  • dependencyManagement 只是声明依赖的版本号,该依赖不会引入,因此子项目需要显示声明所需要引入的依赖,若不声明则不引入
  • 子项目声明了依赖且未声明版本号和scope,则会继承父项目的版本号和scope,否则覆盖
Maven中,`<dependencies>` `<dependencyManagement>` 都是用于管理依赖标签,但它们的用途行为有显著区别: --- ### **1. `<dependencies>`** - **作用**:直接声明项目所需的依赖,这些依赖会被**立即引入**到当前项目中。 - **特点**: - 子模块会**直接继承**父项目中 `<dependencies>` 声明的依赖。 - 依赖的版本、作用域(scope)等配置会直接生效。 - **适用场景**:适用于所有模块**必须使用**的公共依赖(如日志框架、工具类库等)。 #### 示例: ```xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.7.0</version> <!-- 直接指定版本 --> </dependency> </dependencies> ``` --- ### **2. `<dependencyManagement>`** - **作用**:统一管理依赖的版本配置,但**不会直接引入依赖**。子模块需要显式声明依赖(无需写版本号)。 - **特点**: - 父项目中定义依赖的版本、作用域等,子模块可以**按需引用**。 - 子模块引用依赖时,如果未指定版本,则继承父项目中 `<dependencyManagement>` 的配置。 - 避免多模块项目中依赖版本冲突。 - **适用场景**:适用于需要**统一版本管理**但不同模块可能选择性使用的依赖(如Spring Cloud组件)。 #### 示例: **父项目**: ```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> <!-- 版本从父项目的dependencyManagement继承 --> </dependency> </dependencies> ``` --- ### **核心区别** | 特性 | `<dependencies>` | `<dependencyManagement>` | |---------------------|-----------------------------------|-----------------------------------| | **是否直接引入依赖** | 是 | 否(需子模块显式声明) | | **版本继承** | 子模块强制继承所有依赖 | 子模块选择性继承(需手动声明依赖)| | **用途** | 强制所有模块使用的公共依赖 | 统一管理版本,避免冲突 | --- ### **最佳实践** - **父项目**:用 `<dependencyManagement>` 统一管理版本,用 `<dependencies>` 声明所有模块必须的依赖。 - **子模块**:通过 `<dependencies>` 按需引用依赖,版本由父项目控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值