一: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传递性依赖解读相关推荐

  1. Maven 传递性依赖

    maven引入的传递性依赖机制,一方面大大简化和方便了依赖声明,另一方面,大部分情况下我们只需要关心项目的直接依赖是什么,而不用考虑这些直接依赖会引入什么传递性依赖.但有时候,当传递性依赖造成问题的时 ...

  2. [Maven实战](9)传递性依赖

    了解Spring的朋友都知道,创建一个Spring Framework项目都需要依赖什么样的Jar包.如果不使用Maven,那么在项目中就需要手动下载相关的依赖.由于Spring Framework又 ...

  3. Maven的传递性依赖及其jar包冲突解决

    一.Maven简介 Maven是一个跨平台的项目管理工具.作为Apache组织的一个颇为成功的开源项目,其主要服务于基于Java平台的项目创建,依赖管理和项目信息管理. 二.Maven的依赖管理 1. ...

  4. Maven 如何处理传递性依赖

    maven引入的传递性依赖机制,一方面大大简化和方便了依赖声明,另一方面,大部分情况下我们只需要关心项目的直接依赖是什么,而不用考虑这些直接依赖会引入什么传递性依赖.但有时候,当传递性依赖造成问题的时 ...

  5. maven 依赖范围影响传递性依赖

      compile test provided runtime compile compile N N runtime test test N N test provided provided N p ...

  6. maven 的依赖传递

    1.   首先就maven的依赖传递来说:只有<scope>compile</scope>时,才能进行依赖的传递,其他的范围没有依赖传递可言!!! 2.   当依赖级别相同时, ...

  7. maven的依赖范围_Maven依赖范围

    maven的依赖范围 介绍: 管理依赖项是Maven的核心功能. 在定义Maven依赖项时, scope属性定义了该依赖项在不同的Maven生命周期阶段(例如build,test和run)上的可见性. ...

  8. maven可选依赖(Optional Dependencies)和依赖排除(Dependency Exclusions)

    我们知道,maven的依赖关系是有传递性的.如:A-->B,B-->C.但有时候,项目A可能不是必需依赖C,因此需要在项目A中排除对A的依赖.在maven的依赖管理中,有两种方式可以对依赖 ...

  9. Maven 排除依赖jar包

    当我们引入第三方jar包的时候,难免会引入传递性依赖,有些时候这是好事,然而有些时候我们不需要其中的一些传递性依赖 比如我们不想引入传递性依赖commons-logging,我们可以使用exclusi ...

最新文章

  1. android 开启一个定时线程_ANDROID开发中定时器的3种方法
  2. String.format 的大用场
  3. ZendStudio导入一个已有的网站
  4. 关于Arrays类总结
  5. Fabric入门之架构
  6. wxpython嵌套panel布局的一个问题
  7. MS SQL收縮資料庫
  8. @Configuration 和 @Bean
  9. 【SpringBoot高级】SpringBoot整合篇
  10. 一个简单的parser
  11. scrapy爬虫框架入门实战
  12. 电脑里的视频被误删了可以用EasyRecovery恢复吗?
  13. 强大的.NET反编译工具Reflector及插件 (转)
  14. 【图像重建】基于matlab GUI投影法图像重建【含Matlab源码 861期】
  15. RabbitMQ 集群原理和完善
  16. 二年级上册计算题_二年级上册数学计算题
  17. jquery html包含自身,jquery 获取 outerHtml 包含当前节点本身的代码
  18. 计算机远程桌面连接连接不上,电脑远程桌面连接不上的解决方法
  19. 什么是机器翻译,主要有哪几种类型?
  20. 超分 Super-Resolution

热门文章

  1. 最长回文子串——动态规划
  2. 毕业设计记录 day(4)
  3. ifconfig 详解
  4. 图像处理里的简单白平衡算法
  5. C/C++万能头文件
  6. DHTMLXGantt 中使用工作时间日历的示例
  7. 安卓手机屏蔽物理按键
  8. 网站服务器域名费用入什么科目,域名费用计入什么科目
  9. JSP九大内置对象和四个作用域
  10. 终于拿到蚂蚁金服Offer!!!分享一下全程面试题和面试经验!