Maven03_依赖和依赖冲突解决
1、传递依赖
比如添加SpringMVC的核心依赖坐标
会发现项目中还出现了spring-webmvc以外的其他jar包。因为我们的项目依赖了spring-webmvc,但是spring-webmvc又依赖了sping-beans.jar等,所以spring-webmvc的依赖包也自动进入了个人项目中。
这种现象就称为传递依赖。
它们的依赖关系图如下:
2、依赖冲突解决方案
1)问题分析
如果在项目中继续添加一个依赖,会发现这两个jar包都依赖了spring-beans,但是两个jar包依赖的版本明显不一致。观察项目传递进来的jar包,发现spring-beans版本是4.2.4,但是我们希望的版本是5.0.2,这就造成了依赖冲突
2)依赖的调解原则
maven自动按照以下原则进行调解:
① 第一声明者优先原则
在pom文件定义的依赖,相同jar包会根据先声明的版本为准
测试:将上面的spring-webmvc和spring-context位置互换,会发现系统导入的spring-beans版本是5.0.2
分析:
因为spring-context的位置放在了前面,所以依赖传递的jar包版本根据声明的优先原则变为了5.0.2
② 路径近者优先原则
例如:还是上述情况,spring-contex 和 spring-webmvc 都会传递过来 spirng-beans,那如果直接把 spring-beans 的依赖直接写到 pom 文件中,
那么项目就不会再使用其他依赖传 递来的 spring-beans,因为自己直接在 pom 中定义 spring-beans 要比其他依赖传递过来的路径要近。
在本工程中的 pom 中加入 spirng-beans-5.0.2 的依赖,根据路径近者优先原则,系统将导入 spirng-beans-5.0.2:
3)排除依赖
上边的问题也可以通过排除依赖方法辅助依赖调解,
如下: 比如在依赖 spring-webmvc 的设置中添加排除依赖,排除 spring-beans, 下边的配置表示:依赖 spring-webmvc,但排除 spring-webmvc 所依赖的 spring-beans。
4)锁定版本
面对众多的依赖,有一种方法不用考虑依赖路径、声明优化等因素。可以采用直接锁定版本的方法确定依赖构件的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径,
以锁定的版本的为准添加到工程中,此方法在企业开发中常用。 如下的配置是锁定了 spring-beans 和 spring-context 的版本:
5)提取版本号
还可以把版本号提取出来,使用<properties>标签设置成变量
注意:在工程中锁定依赖的版本并不代表在工程中添加了依赖,如果工程需要添加锁定版本的依赖则需要单独添加标签<dependencies></dependencies>,如下:
上边添加的依赖并没有指定版本,原因是已在<denpendencyManagement>中锁定了版本, 所以在<dependency>下不需要再指定版本。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义