当依赖提供范围时,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上。
该表是该主题的关键点:
从中我们可以看到,范围compile
或runtime
传递的内容在提供的范围内, 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
Bingo : dependencyManagement
部分覆盖了传递依赖的范围,也影响了provided
范围的中介。 这不是一个错误,它是设计的,因为在本节中,您定义了有关您的依赖关系的治理类型。 这种情况下的图也是正确的而且没有误导性,因为依赖性只是由openejb-core
引入,然后由dependencyManagement
决定将sl4f-api
放入范围compile
。