Maven 传递依赖具有编译范围,而当依赖提供范围时
Maven transitive dependency has scope compile while when dependency has provided scope
在我的项目中,我有 openejb-core
范围 provided
的依赖项。然而,它具有 slf4j
的传递依赖性,其范围是 compile
(见屏幕截图)。所有其他传递依赖项均按预期提供。
问题:是错误还是我遗漏了什么?
在我添加的示例 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.
table是本题的重点:
从中我们可以看出,范围compile
或runtime
中传递的内容进入提供的范围,范围provided
或test
中的内容被忽略.
但是,如果我将示例 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
的决定的影响.
在我的项目中,我有 openejb-core
范围 provided
的依赖项。然而,它具有 slf4j
的传递依赖性,其范围是 compile
(见屏幕截图)。所有其他传递依赖项均按预期提供。
问题:是错误还是我遗漏了什么?
在我添加的示例 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.
table是本题的重点:
从中我们可以看出,范围compile
或runtime
中传递的内容进入提供的范围,范围provided
或test
中的内容被忽略.
但是,如果我将示例 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
的决定的影响.