Java Maven可传递依赖项具有范围编译,而依赖项提供了范围
在我的项目中,我提供了范围为Java Maven可传递依赖项具有范围编译,而依赖项提供了范围,java,maven,maven-3,pom.xml,dependency-management,Java,Maven,Maven 3,Pom.xml,Dependency Management,在我的项目中,我提供了范围为的openejb核心依赖项。但是,它具有slf4j的传递依赖关系,其范围是compile(请参见屏幕截图)。所有其他可传递依赖项都按预期提供 问题:是bug还是我遗漏了什么 在我添加的样品pom中: org.apache.openejb . 屏幕截图中的问题可能在IDE上 该表是该主题的关键点: 从中,我们可以看到,在范围编译或运行时中传递的内容在提供的范围内,在范围中提供的或测试中传递的内容被忽略 但是,如果我将示例pom更改为: org.apache.ope
的openejb核心
依赖项
。但是,它具有slf4j
的传递依赖关系,其范围是compile
(请参见屏幕截图)。所有其他可传递依赖项都按预期提供
问题:是bug还是我遗漏了什么
在我添加的样品pom中:
org.apache.openejb
. 屏幕截图中的问题可能在IDE上
该表是该主题的关键点:
从中,我们可以看到,在范围编译
或运行时
中传递的内容在提供的范围内,在范围中提供的
或测试
中传递的内容被忽略
但是,如果我将示例pom更改为:
org.apache.openejb
openejb内核
4.7.0
假如
org.slf4j
slf4j api
1.7.7
并重新运行dependency tree命令,输出如下:
[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中添加了以下内容:
[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
org.slf4j
slf4j api
1.7.7
编译
然后重新运行dependency tree命令,我最终得到与您的屏幕截图相同的结果:
[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
宾果:依赖项管理
部分覆盖了可传递依赖项的范围,也影响了提供的
范围上的中介。这不是一个bug,而是设计上的问题,因为在本节中,您定义了一种与依赖项相关的治理。这种情况下的图表也是正确的,没有误导性,由于依赖关系仅由openejb-core
引入,然后受dependencyManagement
将sl4f-api
放入作用域compile的决定的影响,那么同样的依赖关系是否也由作用域compile中的另一个依赖关系过渡引入呢?不。仅在这个例子中,它为您的项目提供了范围。但是openejb core可以用compile作用域声明它,这就是为什么您可以将它视为compile会自动将可传递依赖项放在scope provide上,而不管它们声明的作用域是什么@巴拉吉卡提卡你说的不是correct@EvgenyMakarov如果运行mvn dependency:tree-Dincludes=org.slf4j
是否在其他地方发现它?是否有家长pom或从属关系管理部分?谢谢您的详细回答。这似乎是依赖管理的情况。我不知道这样的maven行为感谢您提供了如此详细的回答,为我澄清了一些事情。我们可以看到类似的问题,没有任何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