在我的项目中,我与范围openejb-core
有provided
依赖关系。但是它具有slf4j
的传递依赖性,其范围为compile
(参见屏幕截图)。所有其他传递依赖项都按预期提供。
问题:是错误还是错过了什么?
答案 0 :(得分:12)
在一个示例pom中我添加了:
<dependencies>
<dependency>
<groupId>org.apache.openejb</groupId>
<artifactId>openejb-core</artifactId>
<version>4.7.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
然后跑步:
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与其official documentation一致。您的屏幕截图中的问题可能在您的IDE上。
通过它,我们可以看到范围compile
或runtime
中的传递范围在提供的范围内,范围provided
或test
中的内容将被忽略。< / p>
但是,如果我将样本pom更改为:
<dependencies>
<dependency>
<groupId>org.apache.openejb</groupId>
<artifactId>openejb-core</artifactId>
<version>4.7.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
</dependencies>
重新运行依赖树命令,输出如下:
[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中:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
<scope>compile</scope>
</dependency>
</dependencies>
</dependencyManagement>
然后重新运行依赖树命令,我最终得到与截图相同的内容:
[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
中