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