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 作为间接依赖被引入到了项目中,可以直接使用
2. 依赖传递冲突时的优先规则
假如一个项目中或直接或间接的多次导入了同一个依赖,就会产生依赖冲突,此时 Maven 会按照下面三种优先规则确定真正依赖的是哪个包:(主要讨论不同版本的依赖,相同版本没什么所谓)
(1) 路径优先
直接依赖优先级最高,其次是间接依赖,然后是间接依赖的直接依赖,间接依赖的间接依赖 ……
层级越深,优先级越低,或者说就近原则,离项目最近的包就是项目真正所依赖的
如下例:
<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>
示例中引入了 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>
和上面一样导入 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>
先声明 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


猜你喜欢
- 前言Spring Boot集成Redis实现单机分布式锁针对单机分布式锁还是存在锁定续期、可重入的问题,本文将采用Spring Boot 集
- 代码如下一、创建EdgeLight.xaml代码如下。<ResourceDictionary xmlns="htt
- 注解注解为我们在代码中添加信息提供一种形式化的方法,使我们可以在源码、编译时、运行时非常方便的使用这些数据。注解是在JAVA SE5中引入的
- 创建SpringBoot项目,启动后,默认的访问路径即主机IP+默认端口号8080:http://localhost:8080/此时,我们就
- spring-retry是什么?spring-retry是spring提供的一个重试框架,原本自己实现的重试机制,现在spring帮封装好提
- 很多开发者表示,不知道Android的Drawable和Bitmap之间如何相关转换。下面Android123给大家两种比较简单高效的方法。
- 前端模板框架为Bootstrap,系统分为前台和后台。后台主要为管理员角色,功能有:商品类型管理、商品管理、订单管理、会员管理、管理员管理等
- 下载 Android SDK,官网:www.android.com 我相信很多人跟我一样,进不去。Android Studio 中文官网 w
- 和之前一样首先看一下WPF钟表效果图 是不是很炫酷,上面的那个花都是带有动画效果的图片 。接下来就是代码了。首先看一下整个场景的布局搭建&l
- 我们都知道java是一种面向对象的编程语言,但是在实际意义上java并不是纯面向对象,因为面向对象的意义就是万物皆对象,那么如果说int类型
- 本文实例讲述了Android开发实现拨打电话与发送信息的方法。分享给大家供大家参考,具体如下:xml布局:<LinearLayout
- 问题在使用 Abp 框架的后台作业时,当后台作业抛出异常,会导致整个程序崩溃。在 Abp 框架的底层执行后台作业的时候,有 try/catc
- 本文实例为大家分享了java生成验证码图片的具体代码,供大家参考,具体内容如下示例一:import org.apache.commons.c
- springboot aop里的@Pointcut()的配置@Pointcut("execution(public * com.w
- 介绍建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一种
- 方式一:例如:”0000123” (字符串必须全为数字)处理过程:String tempStr = "0000123";
- 最近在学习AngularJS的知识,收获不少,不过因为自己平时工作时开发都是用的freemarker+springmvc来做的页面数据交互,
- 本文实例为大家分享了ToolBar的使用方法,供大家参考,具体内容如下ToolBar时应用的标准工具栏;用来替代ActionBar;使用To
- 现在android的每一个项目都会需要设置为全屏,现在介绍两种设置为全屏的方式。一、在配置文件中设置android:theme=”@andr
- 先创建一个title.xml<LinearLayout xmlns:android="http:/