Maven依赖管理的用法介绍

作者:mzz124 时间:2021-07-13 18:07:35 

一、依赖传递

1. 直接依赖与间接依赖

pom.xml 声明了的依赖是直接依赖,依赖中又包含的依赖就是间接依赖(直接依赖的直接依赖),间接依赖虽然未被声明,但也是依赖所必须的依赖,同时间接依赖中的资源也可以直接使用

比如 A 依赖了 B,B 依赖了 C,那么 A 也就间接的依赖了 C,如果没有 C,那么 A 和 B 都无法正常运行,A 也可以直接使用 C 的内容,而可以不必再声明 C

实例如 spring-webmvc:

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>

学习 Spring 时需要导入 spring-context 依赖,但学习 SpringMVC 时,我们会导入 spring-webmvc,此时即便会用到 Spring 的功能也无需再导入 spring-context。因为 spring-webmvc 依赖了 spring-context,spring-context 作为间接依赖被引入到了项目中,可以直接使用

Maven依赖管理的用法介绍

2. 依赖传递冲突时的优先规则

假如一个项目中或直接或间接的多次导入了同一个依赖,就会产生依赖冲突,此时 Maven 会按照下面三种优先规则确定真正依赖的是哪个包:(主要讨论不同版本的依赖,相同版本没什么所谓)

(1) 路径优先

直接依赖优先级最高,其次是间接依赖,然后是间接依赖的直接依赖,间接依赖的间接依赖 &hellip;&hellip;

层级越深,优先级越低,或者说就近原则,离项目最近的包就是项目真正所依赖的

如下例:

<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.19.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
</dependencies>

Maven依赖管理的用法介绍

示例中引入了 spring-context 5.1.19 为直接依赖,又引入 spring-webmvc 5.2.10,其中又依赖了 spring-context 5.2.10,但它是间接依赖,所以项目中所使用的 spring-context 资源是 5.1.19 版本的(但并不代表 webmvc 中的 context 版本也被改为了 5.1.19),图中也可以看到 IDEA 在依赖后边给出了冲突标识

(2) 声明优先

相同层级的依赖资源,先被声明的优先

如下例:(和刚才的一样)

<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.19.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
</dependencies>

Maven依赖管理的用法介绍

和上面一样导入 spring-context 5.1.19 和 spring-webmvc 5.2.10,可以看到 context 和 webmvc 都又依赖了 aop, beans, core 等几个包,且都是间接依赖,层级相等,但由于先声明的 context 5.1.19,所以其中的 aop, core 等几个包的优先级更高

(3) 后声明覆盖先声明

同时声明了同一个依赖的不同版本,那么先声明的版本会被最后声明的版本覆盖掉(以最后一次声明为准)

如下例:

<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.19.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
</dependencies>

Maven依赖管理的用法介绍

先声明 spring-context 5.1.19,又声明了 spring-context 5.2.10,最后使用的依赖版本为 5.2.10

二、依赖管理

分模块开发时,合理的管理依赖能够避免掉依赖冲突可能带来的麻烦。

1. 可选依赖

用于对外隐藏本项目中使用的依赖。如果项目中将某个依赖设置为可选依赖,那么其他项目引用此项目时不会加载到可选依赖。

只需在声明依赖时加入 optional 标签,设置值为 true 即可(默认为 false)

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.19.RELEASE</version>
<optional>true</optional>
</dependency>

如上设置后,其他项目引入此项目时,不会加载到此项目中的 spring-context 5.1.19

2. 排除依赖

引入依赖时,用于排除掉该依赖中传递来的指定依赖。

需要在声明依赖时加入 exclusions 标签,内含多个 exclusion,设置 要排除的依赖坐标,不必指定版本

<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-webmvc</artifactId>
   <version>5.2.10.RELEASE</version>
   <exclusions>
       <exclusion>
           <groupId>org.springframework</groupId>
           <artifactId>spring-aop</artifactId>
       </exclusion>
       <exclusion>
           <groupId>org.springframework</groupId>
           <artifactId>spring-core</artifactId>
       </exclusion>
   </exclusions>
</dependency>

如上设置后,本项目不会加载 spring-webmvc 依赖中包含的 spring-aop 和 spring-core

3. 可选依赖与排除依赖的异同点

相同点:

  • 功能相同:都用于阻断依赖的传递

不同点:

  • 原理不同:可选依赖对外不透明,排除依赖有传递但不采用

  • 生效时机不同:可选依赖生效在项目被引入时,排除依赖生效在引入其他项目时

来源:https://blog.csdn.net/Cey_Tao/article/details/126561208

标签:Maven,依赖,管理,作用,配置
0
投稿

猜你喜欢

  • C# Newtonsoft.Json 解析多嵌套json 进行反序列化的实例

    2022-04-09 11:23:13
  • Android开发实现模仿微信小窗口功能【Dialog对话框风格窗口】

    2022-01-27 10:11:01
  • 深入解析Android系统中应用程序前后台切换的实现要点

    2022-09-11 01:26:30
  • 互斥量mutex的简单使用(实例讲解)

    2023-09-20 21:36:50
  • Spring Security实现用户名密码登录详解

    2021-05-24 14:32:36
  • Java实现Android拼图游戏设计过程解析

    2021-10-02 17:13:18
  • 全面理解Java类和对象

    2021-11-17 11:11:50
  • C#使用ILGenerator动态生成函数的简单代码

    2022-07-10 01:41:06
  • C#冒泡法排序算法实例分析

    2023-08-13 18:03:42
  • C#如何获取计算机信息

    2022-08-24 23:59:34
  • 探讨Java中函数是值传递还是引用传递问题

    2021-07-25 19:34:44
  • 详解Android中Intent的使用方法

    2023-08-02 04:40:29
  • springboot FeignClient注解及参数

    2021-07-09 21:59:07
  • 使用javaMail实现发送邮件

    2023-01-20 21:22:26
  • Java 如何使用Feign发送HTTP请求

    2023-05-10 15:04:08
  • Java设计模式中的命令模式

    2023-11-20 04:26:46
  • Java深入学习图形用户界面GUI之事件处理

    2023-11-29 14:14:57
  • 详解Java 集合系列(三)—— LinkedList

    2022-01-30 16:49:10
  • Java二维数组实现数字拼图效果

    2021-11-21 20:39:17
  • 这一次搞懂Spring事务是如何传播的

    2022-12-27 07:06:53
  • asp之家 软件编程 m.aspxhome.com