学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
Python实战微信订餐小程序 | 进阶级 | 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 |
Python量化交易实战 | 入门级 | 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 |
现在的项目一般是拆分成一个个独立的模块,当在其他项目中想要使用独立出来的这些模块,只需要在其pom.xml使用标签来进行jar包的引入即可。
其实就是依赖,关于依赖管理里面都涉及哪些内容,我们就一个个来分析下:
我们先来说说什么是依赖:
依赖指当前项目运行所需的jar,一个项目可以设置多个依赖。
格式为:
org.springframeworkgroupId>
spring-webmvcartifactId>
5.2.10.RELEASEversion>
dependency>
dependencies>
比如下面的项目的依赖中
有一个比较大的区别就是有的依赖前面有箭头>
,有的依赖前面没有。
那么这个箭头所代表的含义是什么?打开前面的箭头,你会发现这个jar包下面还包含有其他的jar包
**说明:**A代表自己的项目;B,C,D,E,F,G代表的是项目所依赖的jar包;D1和D2 E1和E2代表是相同jar包的不同版本
(1) A依赖了B和C,B和C有分别依赖了其他jar包,所以在A项目中就可以使用上面所有jar包,这就是所说的依赖传递
(2) 依赖传递有直接依赖和间接依赖
(3)因为有依赖传递的存在,就会导致jar包在依赖的过程中出现冲突问题,具体什么是冲突?Maven是如何解决冲突的?
这里所说的依赖冲突是指项目依赖的某一个jar包,有多个不同的版本,因而造成类包版本冲突。
情况一: 在pom.xml中添加两个不同版本的Junit依赖:
junitgroupId>
junitartifactId>
4.12version>
testscope>
dependency>
junitgroupId>
junitartifactId>
4.11version>
testscope>
dependency>
dependencies>
通过对比,会发现一个结论
情况二: 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高
情况三: 声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的
但是对应上面这些结果,大家不需要刻意去记它。因为不管Maven怎么选,最终的结果都会在Maven的Dependencies
面板中展示出来,展示的是哪个版本,也就是说它选择的就是哪个版本
如果想更全面的查看Maven中各个坐标的依赖关系,可以点击Maven面板中的show Dependencies
,例如
在这个视图中就能很明显的展示出jar包之间的相互依赖关系。
依赖传递介绍完以后,我们来思考一个问题,
**说明:**在真实使用的过程中,maven_02_ssm中是需要用到maven_03_pojo的,我们这里只是用这个例子描述我们的需求。因为有时候,maven_04_dao出于某些因素的考虑,就是不想让别人使用自己所依赖的maven_03_pojo。
在maven_04_dao
的pom.xml,在引入maven_03_pojo
的时候,添加optional
com.itheimagroupId>
maven_03_pojoartifactId>
1.0-SNAPSHOTversion>
trueoptional>
dependency>
此时就出问题了,说明由于maven_04_dao将maven_03_pojo设置成可选依赖,导致maven_02_ssm无法引用到maven_03_pojo中的内容,导致需要的类找不到。
前面我们已经通过可选依赖实现了阻断maven_03_pojo的依赖传递,对于排除依赖,则指的是已经有依赖的事实,也就是说maven_02_ssm项目中已经通过依赖传递用到了maven_03_pojo,此时我们需要做的是将其进行排除,所以接下来需要修改maven_02_ssm的pom.xml
com.itheimagroupId>
maven_04_daoartifactId>
1.0-SNAPSHOTversion>
com.itheimagroupId>
maven_03_pojoartifactId>
exclusion>
exclusions>
dependency>
排除依赖资源仅需指定groupId,artifactId即可,不用指定version,会把不同的版本都排除掉
当然exclusions
标签带s
说明我们是可以依次排除多个依赖到的jar包,比如maven_04_dao中有依赖junit和mybatis,我们也可以一并将其排除。
com.itheimagroupId>
maven_04_daoartifactId>
1.0-SNAPSHOTversion>
com.itheimagroupId>
maven_03_pojoartifactId>
exclusion>
log4jgroupId>
log4jartifactId>
exclusion>
org.mybatisgroupId>
mybatisartifactId>
exclusion>
exclusions>
dependency>
介绍我这两种方式后,简单来梳理下,就是
A依赖B,B依赖C
,C
通过依赖传递会被A
使用到,现在要想办法让A
不去依赖C
A
不知道有C
的存在,代表这个依赖是否需要被发现。这种适用于可以修改B的配置文件的情况下A
知道有C
的存在,主动将其排除掉。代表这个依赖已经被发现,但自己是否需要引用。这种适用于不能修改B的配置文件的情况下如果您觉得阅读本文对您有帮助,请点一下“**推荐**”按钮,您的**“推荐”**将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后**必须在文章页面明显位置给出作者和原文连接**,否则保留追究法律责任的权利。