当依赖提供范围时,Maven传递依赖具有范围编译

在我的项目中,我提供了openejb-core依赖,并provided了范围。 但它具有slf4j传递依赖性,其范围是compile (见截图)。 所有其他传递依赖项都按预期提供。

问题 :是错误还是我错过了什么?

在此处输入图像描述

在一个示例pom中我添加了:

   org.apache.openejb openejb-core 4.7.0 provided   

然后运行:

 mvn dependency:tree -Dincludes=org.slf4j 

输出是:

 [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ test-junit --- [INFO] com.sample:test-sample:jar:0.0.1-SNAPSHOT [INFO] \- org.apache.openejb:openejb-core:jar:4.7.0:provided [INFO] +- org.slf4j:slf4j-jdk14:jar:1.7.7:provided [INFO] \- org.slf4j:slf4j-api:jar:1.7.7:provided 

因此,您可以看到Maven与其官方文档一致。 屏幕截图中的问题可能在您的IDE上。

该表是该主题的关键点: 在此处输入图像描述

从中我们可以看到,范围compileruntime传递的内容在提供的范围内, provided范围或test被忽略。

但是,如果我将我的样本pom更改为:

   org.apache.openejb openejb-core 4.7.0 provided   org.slf4j slf4j-api 1.7.7   

并重新运行依赖树命令,输出如下:

 [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ test-junit --- [INFO] com.sample:test-sample:jar:0.0.1-SNAPSHOT [INFO] +- org.apache.openejb:openejb-core:jar:4.7.0:provided [INFO] | \- org.slf4j:slf4j-jdk14:jar:1.7.7:provided [INFO] \- org.slf4j:slf4j-api:jar:1.7.7:compile 

现在看看:它不是所提供的依赖项的孩子,而是在同一级别。

让我们继续吧。

如果我的样本pom我删除sl4f-api依赖,但我添加到pom以下:

    org.slf4j slf4j-api 1.7.7 compile    

并重新运行依赖树命令,我最终获得与截图相同的内容:

 [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ test-junit --- [INFO] com.sample:test-sample:jar:0.0.1-SNAPSHOT [INFO] \- org.apache.openejb:openejb-core:jar:4.7.0:provided [INFO] +- org.slf4j:slf4j-jdk14:jar:1.7.7:provided [INFO] \- org.slf4j:slf4j-api:jar:1.7.7:compile 

BingodependencyManagement部分覆盖了传递依赖的范围,也影响了provided范围的中介。 这不是一个错误,它是设计的,因为在本节中,您定义了有关您的依赖关系的治理类型。 这种情况下的图也是正确的而且没有误导性,因为依赖性只是由openejb-core引入,然后由dependencyManagement决定将sl4f-api放入范围compile