Maven传递性依赖解读
一:DependencyManagement / Dependencies的区别
dependencyManagement统一管理项目的版本号,只声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。在子项目中写了该依赖项,并且没有指定具体版本,会自动从父项目中继承该项,并且version和scope都读取自父pom; 另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。
所有声明在dependencies里的依赖都会自动引入,并默认被所有的子项目继承。一般webapp的pom不能直接写dependencies,需嵌套在dependencyManagement中。
二:3种特殊范围声明
compile:编译依赖范围。如果没有指定,就会默认使用该依赖范围。使用此依赖范围的Maven依赖,对于编译、测试、运行三种classpath都有效。典型的例子是spring-core,在编译,测试和运行的时候都需要使用该依赖。
provided:已提供依赖范围。使用此依赖范围的Maven依赖,对于编译和测试classpath有效,但在运行时无效。典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行项目的时候,由于tomcat容器已经提供,就不需要Maven重复地引入一遍。
test:测试依赖范围。使用此依赖范围的Maven依赖,只对于测试classpath有效,在编译主代码或者运行项目的使用时将无法使用此类依赖。典型的例子就是JUnit,它只有在编译测试代码及运行测试的时候才需要。
例如:在dependencyManagement中声明:
三:依赖关系
1).短路优先:谁离得最近就使用谁的依赖jar包
C到达A为C->B->A
C到达B为C->B
例如:
A中的 commons-io的版本为2.4
B中的commons-io的版本为2.0
C中依赖于B,B依赖于A
则C的junit的包为2.0版本
因为依赖的短路优先
2).如果两条路都是一样长的时候呢?
C到达A为C->A
C到达B为C->B
则看pom文件中依赖的两个工程谁在前面就是用哪个版本。但不一定生效 , 往往是这种路径一致造成jar冲突。
fee-facade:关系图:可以看到引入了m-commons。
但是在webapp实际引用关系图中fee-facade下层并没有出现m-commons。
可以查一下m-commoms实际上在这被引用,是被bprod-facade带进来的。离根部距离为2,而fee-facade离根部距离为2,所以它的m-commms距离为3。所以根据就近原则。真实引用的为距离为2的m-commoms。
四:jar包冲突
如果项目同时依赖两个子项目的某个包,路径一样且版本号不一致。编译打包后target目录生成了2个不同版本的jar包。运行时候会报错。我们可以通过报错信息在依赖关系图中找到真实的引用。制定新版本或者把低版本的jar包exclude掉。
Maven传递性依赖解读相关推荐
- Maven 传递性依赖
maven引入的传递性依赖机制,一方面大大简化和方便了依赖声明,另一方面,大部分情况下我们只需要关心项目的直接依赖是什么,而不用考虑这些直接依赖会引入什么传递性依赖.但有时候,当传递性依赖造成问题的时 ...
- [Maven实战](9)传递性依赖
了解Spring的朋友都知道,创建一个Spring Framework项目都需要依赖什么样的Jar包.如果不使用Maven,那么在项目中就需要手动下载相关的依赖.由于Spring Framework又 ...
- Maven的传递性依赖及其jar包冲突解决
一.Maven简介 Maven是一个跨平台的项目管理工具.作为Apache组织的一个颇为成功的开源项目,其主要服务于基于Java平台的项目创建,依赖管理和项目信息管理. 二.Maven的依赖管理 1. ...
- Maven 如何处理传递性依赖
maven引入的传递性依赖机制,一方面大大简化和方便了依赖声明,另一方面,大部分情况下我们只需要关心项目的直接依赖是什么,而不用考虑这些直接依赖会引入什么传递性依赖.但有时候,当传递性依赖造成问题的时 ...
- maven 依赖范围影响传递性依赖
compile test provided runtime compile compile N N runtime test test N N test provided provided N p ...
- maven 的依赖传递
1. 首先就maven的依赖传递来说:只有<scope>compile</scope>时,才能进行依赖的传递,其他的范围没有依赖传递可言!!! 2. 当依赖级别相同时, ...
- maven的依赖范围_Maven依赖范围
maven的依赖范围 介绍: 管理依赖项是Maven的核心功能. 在定义Maven依赖项时, scope属性定义了该依赖项在不同的Maven生命周期阶段(例如build,test和run)上的可见性. ...
- maven可选依赖(Optional Dependencies)和依赖排除(Dependency Exclusions)
我们知道,maven的依赖关系是有传递性的.如:A-->B,B-->C.但有时候,项目A可能不是必需依赖C,因此需要在项目A中排除对A的依赖.在maven的依赖管理中,有两种方式可以对依赖 ...
- Maven 排除依赖jar包
当我们引入第三方jar包的时候,难免会引入传递性依赖,有些时候这是好事,然而有些时候我们不需要其中的一些传递性依赖 比如我们不想引入传递性依赖commons-logging,我们可以使用exclusi ...
最新文章
- android 开启一个定时线程_ANDROID开发中定时器的3种方法
- String.format 的大用场
- ZendStudio导入一个已有的网站
- 关于Arrays类总结
- Fabric入门之架构
- wxpython嵌套panel布局的一个问题
- MS SQL收縮資料庫
- @Configuration 和 @Bean
- 【SpringBoot高级】SpringBoot整合篇
- 一个简单的parser
- scrapy爬虫框架入门实战
- 电脑里的视频被误删了可以用EasyRecovery恢复吗?
- 强大的.NET反编译工具Reflector及插件 (转)
- 【图像重建】基于matlab GUI投影法图像重建【含Matlab源码 861期】
- RabbitMQ 集群原理和完善
- 二年级上册计算题_二年级上册数学计算题
- jquery html包含自身,jquery 获取 outerHtml 包含当前节点本身的代码
- 计算机远程桌面连接连接不上,电脑远程桌面连接不上的解决方法
- 什么是机器翻译,主要有哪几种类型?
- 超分 Super-Resolution