Maven高级: 依赖管理

1.依赖管理

今天来学习Maven高级知识:依赖管理
我们现在已经能把项目拆分成一个个独立的模块,当在其他项目中想要使用独立出来的这些模块,只需要在其pom.xml使用标签来进行jar包的引入即可。

什么是依赖?
依赖指当前项目运行所需的jar,一个项目可以设置多个依赖。
格式为:

<!--设置当前项目所依赖的所有jar-->
<dependencies>
	<!--设置具体的依赖-->
	<dependency>
		<!--依赖所属群组id-->
		<groupId>org.springframework</groupId>
		<!--依赖所属项目id-->
		<artifactId>spring-webmvc</artifactId>
		<!--依赖版本号-->
		<version>5.2.10.RELEASE</version>
	</dependency>
</dependencies>

依赖管理管理什么?
1.依赖传递
2.可选依赖
3.排除依赖

1.1 依赖传递与冲突问题

回顾我们上一次学习的分模块开发,打开Maven的面板:
在这里插入图片描述
在项目所依赖的这些jar包中,有一个比较大的区别就是有的依赖前面有箭头 > ,有的依赖前面没有。那么这个箭头所代表的含义是什么?

打开前面的箭头,你会发现这个jar包下面还包含有其他的jar包:
在这里插入图片描述
你会发现有两个maven_03_pojo的依赖被加载到Dependencies中,那么maven_04_dao中的maven_03_pojo能不能使用呢?

要想验证非常简单,只需要把maven_02_ssm项目中pom.xml关于maven_03_pojo的依赖注释或删除掉。
在这里插入图片描述
在Dependencies中移除自己所添加maven_03_pojo依赖后,打开BookServiceImpl的类,你会发现Book类依然存在,可以被正常使用。
在这里插入图片描述

1.1 依赖传递

这个特性其实就是我们要讲解的依赖传递
依赖是具有传递性的:
在这里插入图片描述
说明:A代表自己的项目;B,C,D,E,F,G代表的是项目所依赖的jar包;D1和D2 E1和E2代表是相同jar包的不同版本。

(1) A依赖了B和C,B和C有分别依赖了其他jar包,所以在A项目中就可以使用上面所有jar包,这就是所说的依赖传递

(2) 依赖传递有直接依赖和间接依赖相对于A来说,A直接依赖B和C,间接依赖了D1,E1,G,F,D2和E2。相对于B来说,B直接依赖了D1和E1,间接依赖了G。直接依赖和间接依赖是一个相对的概念

(3)因为有依赖传递的存在,就会导致jar包在依赖的过程中出现冲突问题,具体什么是冲突?Maven是如何解决冲突的?

这里所说的依赖冲突是指项目依赖的某一个jar包,有多个不同的版本,因而造成类包版本冲突:

情况一: 在maven_02_ssm的pom.xml中添加两个不同版本的Junit依赖:

<dependencies>
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>4.12</version>
		<scope>test</scope>
	</dependency>
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>4.11</version>
		<scope>test</scope>
	</dependency>
</dependencies>

在这里插入图片描述
通过对比,会发现一个结论:
特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的。

情况二:路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高。

A通过B间接依赖到E1;A通过C间接依赖到E2。

A就会间接依赖到E1和E2,Maven会按照层级来选择,E1是2度,E2是3度,所以最终会选择E1

情况三:声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的。
A通过B间接依赖到D1;A通过C间接依赖到D2。

D1和D2都是两度,这个时候就不能按照层级来选择,需要按照声明来,谁先声明用谁,也就是说B在C之前声明,这个时候使用的是D1,反之则为D2。但是对应上面这些结果,大家不需要刻意去记它。因为不管Maven怎么选,最终的结果都会在Maven\的Dependencies面板中展示出来,展示的是哪个版本,也就是说它选择的就是哪个版本,如:

在这里插入图片描述
tip:
如果想更全面的查看Maven中各个坐标的依赖关系,可以点击Maven面板中的show Dependencies,从视图中就能很明显的展示出jar包之间的相互依赖关系。

1.2 可选依赖和排除依赖

在这里插入图片描述

2.1 可选依赖

在这里插入图片描述
在这里插入图片描述

2.2 排除依赖

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
总结:
A依赖B,B依赖C , C通过依赖传递会被A使用到,现在要想办法让A不去依赖C。两种方案:

1.可选依赖是在B上设置 , A不知道有C的存在,
2.排除依赖是在A上设置 , A知道有C的存在,主动将其排除掉。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值