依赖范围:

其中依赖范围scope用来控制依赖和编译,测试,运行的classpath的关系.主要的是三种依赖关系如下:

 

yarn间接依赖升级_bc

1.compile:默认编译依赖范围。对于编译,测试,运行三种classpath都有效

2.test:测试依赖范围。只对于测试classpath有效

3.provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api

4.runtime:运行时提供。例如:jdbc驱动


依赖传递:


A、B、C

 

B工程依赖A工程,C工程依赖B工程,那么B工程是C工程的直接依赖,A工程是C工程的间接依赖


由于默认是compile,所以当形成以上的依赖链条时则在C工程中会有A和B的依赖工程。

yarn间接依赖升级_bc_02


如图:

yarn间接依赖升级_bc_03


依赖传递范围:

yarn间接依赖升级_ide_04



左边第一列表示第一直接依赖范围

上面第一行表示第二直接依赖范围

中间的交叉单元格表示传递性依赖范围。

 

总结:

Ø  当第二依赖的范围是compile的时候,传递性依赖的范围与第一直接依赖的范围一致。

Ø  当第二直接依赖的范围是test的时候,依赖不会得以传递。

Ø  当第二依赖的范围是provided的时候,只传递第一直接依赖范围也为provided的依赖,且传递性依赖的范围同样为 provided;

Ø  当第二直接依赖的范围是runtime的时候,传递性依赖的范围与第一直接依赖的范围一致,但compile例外,此时传递的依赖范围为runtime;




依赖冲突




 在maven中存在两种冲突方式:一种是跨pom文件的冲突,一致是同一个pom文件中的冲突。



     跨pom文件的冲突

MavenFirst的pom文件中依赖来junit的4.9版本,那边MavenSecond和MavenThird中都是使用了4.9版本。

yarn间接依赖升级_传递性_05


如果MavenSecond中重新依赖junit的4.8版本,那么MavenSecond和MavenThird中都是使用了4.8本,这体现来依赖的就近使用原则。

yarn间接依赖升级_传递性_06

依赖的jar包如下:



yarn间接依赖升级_yarn间接依赖升级_07


       同一个pom文件的冲突



yarn间接依赖升级_bc_08



  可选依赖

Optional标签标示该依赖是否可选,默认是false。可以理解为,如果为true,则表示该依赖不会传递下去,如果为false,则会传递下去。

yarn间接依赖升级_ide_09

排除依赖

Exclusions标签可以排除依赖


yarn间接依赖升级_ide_10