Maven01_05_compile和test依赖范围Maven的一些依赖情况依赖冲突如果出现冲突就会采取就近原则可选依赖(optional)排除依赖(exclusions)

Posted 平凡加班狗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Maven01_05_compile和test依赖范围Maven的一些依赖情况依赖冲突如果出现冲突就会采取就近原则可选依赖(optional)排除依赖(exclusions)相关的知识,希望对你有一定的参考价值。

compile和test依赖范围、Maven的一些依赖情况


什么是依赖管理,依赖管理就是这些玩意

compile和test依赖范围

在这里插入图片描述
其中依赖范围scope 用来控制依赖和编译,测试,运行的classpath的关系. 主要的是三种依赖关系如下:

compile: 默认编译依赖范围。对于编译,测试,运行三种classpath都有效
test:测试依赖范围。只对于测试classpath有效
provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api
runtime:运行时提供。例如:jdbc驱动

下面看具体解释和操作:
在这里插入图片描述
在这里插入图片描述
还可以这么写
那么到底是什么叫编译(compile)范围呢
什么叫测试(test)范围呢

在这里插入图片描述
下面具体看看

根据前两节我们所讲的,我们可以知道
在这里插入图片描述
这种呢,就是直接的依赖
那么什么叫做间接的依赖呢
间接依赖也很好理解,比如test1依赖于test2,test2依赖于test3,那么test3和test1就是间接依赖关系
或者简单点 test2依赖test1,test3依赖 test2 我们组成这样一种关系

依赖跟依赖的范围有什么关系呢

在这里插入图片描述
其它的先删掉
在这里插入图片描述
test2依赖test1,test3依赖 test2 我们组成这样一种关系
在这里插入图片描述
在这里插入图片描述
当第二依赖的范围是compile的时候,依赖可以传递
当第二直接依赖的范围是test的时候,依赖不会得以传递

依赖冲突

在这里插入图片描述
假如test1使用junit4.10依赖,并且scope是compile,那test2,test3都可以使用test1的junit4.10,因为传递下来了
在这里插入图片描述
假如test2使用junit4.9依赖,那test3会使用==【就近的一个依赖】==,也就是使用junit4.9
在这里插入图片描述
验证
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
test待会去掉,默认是编译,会传递
放test2里面去
在这里插入图片描述
这样test1就是4.0的版本,test2就是4.9的版本
test3就会采取就近原则
在这里插入图片描述
即,如果出现冲突,就会采取就近原则

可选依赖

 true/false 是否可选,也可以理解为是否向下传递。
在依赖中添加optional选项决定此依赖是否向下传递,如果是true则不传递,如果是false就传递,默认为false
在这里插入图片描述
不加这个标签,默认就是可以传递
这种相当于我不给你

排除依赖

exclusions可用于排除依赖,注意exclusions是写在dependency中
在这里插入图片描述
即 我们可以在test3这边设置,让它不要去用test1
即排除掉test1
在这里插入图片描述
相当于 test3 主动不要test1
我自己要求不要它,就这么简单,你给我我不要

以上是关于Maven01_05_compile和test依赖范围Maven的一些依赖情况依赖冲突如果出现冲突就会采取就近原则可选依赖(optional)排除依赖(exclusions)的主要内容,如果未能解决你的问题,请参考以下文章

04_项目一众筹00_05Maven依赖概念,依赖范围依赖传递性依赖的原则:解决jar包冲突依赖排除统一版本管理

maven 的作用域和传递依赖问题

Maven依赖及范围

Maven01_03_项目引用另一个项目

maven依赖本地非repository中的jar包

Maven中的依赖的使用范围