Maven-传递性依赖和依赖范围

比如account-mail项目有一个compile范围的spring-core依赖,spring-core有一个compile范围的commons-logging依赖,那么commons-logging就会成为account-email的compile范围依赖,commons-logging是account-email的一个传递性依赖。

有了传递性依赖机制,在使用Spring Framework的时候就不用去考虑它依赖的什么,也不用担心引入多余的依赖。Maven会解析各个直接依赖的POM,将那些必要的间接依赖,以传递性依赖的形式引入到当前的项目中。

假设A依赖于B,B依赖于C,我们说A对B是第一直接依赖,B对于C是第二直接依赖,A对于C是传递性依赖。第一直接依赖的范围和第二直接依赖的范围决定了传递性依赖的范围。

依赖范围影响传递性依赖
  compile test provided runtime
compile compile - - runtime
test test - - test
provided provided - provided provided
runtime runtime - - runtime

最左边一列表示第一直接依赖范围,最上面一行表示第二直接依赖范围,中间交叉单元格表示传递性依赖范围

再举个例子:

account-email项目有一个com.icegreen:greenmail:1.3.1b的直接依赖,我们说这时第一直接依赖,其依赖范围是test;而greenmail又有一个javax.mail:mail:1.4的直接依赖,我们说这是第二直接依赖,对照表可以知道,当第一直接依赖范围为test,第二直接依赖范围是compile的时候,传递性依赖的范围是test。因此,javax.mail:mail:1.4是account-email的一个范围是test的传递性依赖。

可以发现这样的规律,当第二直接依赖的范围是compile的时候,传递性依赖的范围与第一直接依赖的范围一致;当第二直接依赖的范围是test的时候,依赖不会得以传递;当第二直接依赖的范围是provided是的时候,只传递第一直接依赖范围也为provided的依赖,且传递性依赖的范围同样也为provided;当第二直接依赖的范围是runtime的时候,传递性依赖的范围与第一直接依赖的范围一致,但compile例外,此时传递性依赖的范围为runtime。

猜你喜欢

转载自blog.csdn.net/tjsahwj/article/details/84324127