Maven 依赖管理(scoper依赖范围,依赖传递,冲突等)

前言
  1. 在上一篇博客中,主要是写的关于如何通过坐标的方式,在互联网中精准定位需要使用的 jar 包,并由*仓库下载到本仓库,其中,坐标主要包括 GAV 这3部分。
  2. 事实上,一个依赖除不仅可以从互联网上导入 jar 包,同时也可以依赖其他模块,也可以被其他模块依赖等
  3. 因此,对于依赖这个标签而言,仅包括 GAV 这3部分是不够的,还包括其他的部分来应对不同模块之间的依赖调用的关系
引入
  1. 提到依赖管理,就必须了解依赖之间调用关系
  2. 举例以下情况
    Maven 依赖管理(scoper依赖范围,依赖传递,冲突等)
  3. 由图,我们可以看到,这三个依赖之间有明显的调用与被调用的关系
  4. 我们的依赖管理就是在这种情境下产生的,即一个依赖对它本身做出规定:这个依赖是否可以被其他依赖所依赖,如果可以,那么可被依赖的层级(范围)是什么样的,哪些部分可以不能被依赖,哪些依赖是会被筛除掉的等
  5. 例如,若依赖 test1 规定它本身不可被依赖,则 test2 就无法依赖 test1。
    反之,若依赖 test1 规定它本身可以被依赖,则 test2 就可以依赖 test1,并且继承依赖 test1 本身所依赖的其他依赖。
scope 范围
  1. 如图所示
    Maven 依赖管理(scoper依赖范围,依赖传递,冲突等)
  2. compile: 默认编译依赖范围。对于编译,测试,运行三种classpath都有效
  3. test:测试依赖范围。只对于测试classpath有效
  4. provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api
  5. runtime:运行时提供。例如:jdbc驱动
依赖冲突
  1. 若 A 依赖 B ,B 依赖 C,但对于同一个 jar ,B 和 C 使用的版本不同
  2. 那么此时,A 对于这个 jar 的版本会参考 B ,即就近原则
可选依赖
  1. < optional > true/false 是否可选,也可以理解为是否向下传递
  2. 在依赖中添加optional选项决定此依赖是否向下传递,如果是true则不传递,如果是false就传递,默认为false
    3.如图
    Maven 依赖管理(scoper依赖范围,依赖传递,冲突等)
排除依赖
  1. 若 A 依赖 B,但是对于依赖 B 本身的部分依赖,依赖 A 并不需要
  2. 此时,就可以在依赖 A 中做出声明,依赖 B 的同时,排除依赖 B 中不需要的部分
  3. 注意exclusions是写在dependency中
    Maven 依赖管理(scoper依赖范围,依赖传递,冲突等)
总结
  1. 依赖管理主要是针对 Maven 项目中,依赖本身做出的管理
  2. 由于 Maven 中,不同模块其本身都会自带一个 pom.xml 配置文件用于管理该项目所会使用到的依赖。且一个模块本身,也可以整体作为一个依赖。
  3. 显然,不同模块之间的依赖与被依赖就需要进行管理