Maven 第二级依赖的可传递依赖如何工作

Maven 第二级依赖的可传递依赖如何工作,maven,transitive-dependency,Maven,Transitive Dependency,我有下面的依赖树 [INFO] +- net.sf.jasperreports:jasperreports:jar:6.5.1:compile [INFO] | +- org.eclipse.jdt.core.compiler:ecj:jar:4.4.2:compile [INFO] | +- org.codehaus.castor:castor-xml:jar:1.3.3:compile [INFO] | | +- org.codehaus.castor:castor-core:jar

我有下面的依赖树

[INFO] +- net.sf.jasperreports:jasperreports:jar:6.5.1:compile
[INFO] |  +- org.eclipse.jdt.core.compiler:ecj:jar:4.4.2:compile
[INFO] |  +- org.codehaus.castor:castor-xml:jar:1.3.3:compile
[INFO] |  |  +- org.codehaus.castor:castor-core:jar:1.3.3:compile
[INFO] |  |  +- commons-lang:commons-lang:jar:2.6:compile
当我在pom文件中添加依赖项“commons lang”作为顶级依赖项时,它会自动删除公共lang的可传递依赖项,甚至不会将其从pom文件中排除

[INFO] +- net.sf.jasperreports:jasperreports:jar:6.5.1:compile
[INFO] |  +- org.eclipse.jdt.core.compiler:ecj:jar:4.4.2:compile
[INFO] |  +- org.codehaus.castor:castor-xml:jar:1.3.3:compile
[INFO] |  |  +- org.codehaus.castor:castor-core:jar:1.3.3:compile
[INFO] |  |  +- javax.inject:javax.inject:jar:1:compile

我们期望的是,当我们从jasperreports中排除公共lang时,它应该排除公共lang。

当在项目中声明依赖项时,pom maven将使用该声明而不是可传递依赖项

[INFO] +- commons-lang:commons-lang:jar:2.6:compile
[INFO] \- net.sf.jasperreports:jasperreports:jar:6.5.1:compile
[INFO]    +- org.eclipse.jdt.core.compiler:ecj:jar:4.4.2:compile
[INFO]    +- org.codehaus.castor:castor-xml:jar:1.3.3:compile
[INFO]    |  +- org.codehaus.castor:castor-core:jar:1.3.3:compile
[INFO]    |  +- javax.inject:javax.inject:jar:1:compile
[INFO]    |  +- stax:stax:jar:1.2.0:compile
[INFO]    |  |  \- stax:stax-api:jar:1.0.1:compile
[INFO]    |  \- javax.xml.stream:stax-api:jar:1.0-2:compile
[INFO]    +- com.fasterxml.jackson.core:jackson-core:jar:2.1.4:compile
省略的依赖项不会显示在maven依赖项树中,我刚刚了解到,由于maven依赖项插件版本3.0,不再支持verbose选项,这将显示省略的依赖项

[INFO] +- commons-lang:commons-lang:jar:2.6:compile
[INFO] \- net.sf.jasperreports:jasperreports:jar:6.5.1:compile
[INFO]    +- org.eclipse.jdt.core.compiler:ecj:jar:4.4.2:compile
[INFO]    +- org.codehaus.castor:castor-xml:jar:1.3.3:compile
[INFO]    |  +- org.codehaus.castor:castor-core:jar:1.3.3:compile
[INFO]    |  +- javax.inject:javax.inject:jar:1:compile
[INFO]    |  +- stax:stax:jar:1.2.0:compile
[INFO]    |  |  \- stax:stax-api:jar:1.0.1:compile
[INFO]    |  \- javax.xml.stream:stax-api:jar:1.0-2:compile
[INFO]    +- com.fasterxml.jackson.core:jackson-core:jar:2.1.4:compile
当我试图在maven命令行中提供-Dverbose选项(对于“mvn依赖项:tree-Dverbose=true”)时,我看到了这一点:


当在项目中声明依赖项时,请参见

中关于答案的注释pom maven将使用该声明而不是可传递依赖项

[INFO] +- commons-lang:commons-lang:jar:2.6:compile
[INFO] \- net.sf.jasperreports:jasperreports:jar:6.5.1:compile
[INFO]    +- org.eclipse.jdt.core.compiler:ecj:jar:4.4.2:compile
[INFO]    +- org.codehaus.castor:castor-xml:jar:1.3.3:compile
[INFO]    |  +- org.codehaus.castor:castor-core:jar:1.3.3:compile
[INFO]    |  +- javax.inject:javax.inject:jar:1:compile
[INFO]    |  +- stax:stax:jar:1.2.0:compile
[INFO]    |  |  \- stax:stax-api:jar:1.0.1:compile
[INFO]    |  \- javax.xml.stream:stax-api:jar:1.0-2:compile
[INFO]    +- com.fasterxml.jackson.core:jackson-core:jar:2.1.4:compile
省略的依赖项不会显示在maven依赖项树中,我刚刚了解到,由于maven依赖项插件版本3.0,不再支持verbose选项,这将显示省略的依赖项

[INFO] +- commons-lang:commons-lang:jar:2.6:compile
[INFO] \- net.sf.jasperreports:jasperreports:jar:6.5.1:compile
[INFO]    +- org.eclipse.jdt.core.compiler:ecj:jar:4.4.2:compile
[INFO]    +- org.codehaus.castor:castor-xml:jar:1.3.3:compile
[INFO]    |  +- org.codehaus.castor:castor-core:jar:1.3.3:compile
[INFO]    |  +- javax.inject:javax.inject:jar:1:compile
[INFO]    |  +- stax:stax:jar:1.2.0:compile
[INFO]    |  |  \- stax:stax-api:jar:1.0.1:compile
[INFO]    |  \- javax.xml.stream:stax-api:jar:1.0-2:compile
[INFO]    +- com.fasterxml.jackson.core:jackson-core:jar:2.1.4:compile
当我试图在maven命令行中提供-Dverbose选项(对于“mvn依赖项:tree-Dverbose=true”)时,我看到了这一点:


请参见

中关于答案的注释。依赖性调解是您正在讨论的规则。这是maven管理可传递依赖项所遵循的规则之一。

它将根据pom中最近的定义将commons lang放入依赖树中

您可以在此处阅读所有规则:

因此,请引用他们的话:

依赖项中介-这决定了当遇到多个版本作为依赖项时,将选择工件的哪个版本。Maven选择了“最接近的定义”。也就是说,它使用依赖关系树中与项目最接近的依赖关系的版本。您总是可以通过在项目的POM中显式声明来保证版本

而且commons lang的依赖关系从未被移除,它在传递树中的位置已经改变。现在它已成为一个1级依赖项

[INFO] +- commons-lang:commons-lang:jar:2.6:compile
[INFO] \- net.sf.jasperreports:jasperreports:jar:6.5.1:compile
[INFO]    +- org.eclipse.jdt.core.compiler:ecj:jar:4.4.2:compile
[INFO]    +- org.codehaus.castor:castor-xml:jar:1.3.3:compile
[INFO]    |  +- org.codehaus.castor:castor-core:jar:1.3.3:compile
[INFO]    |  +- javax.inject:javax.inject:jar:1:compile
[INFO]    |  +- stax:stax:jar:1.2.0:compile
[INFO]    |  |  \- stax:stax-api:jar:1.0.1:compile
[INFO]    |  \- javax.xml.stream:stax-api:jar:1.0-2:compile
[INFO]    +- com.fasterxml.jackson.core:jackson-core:jar:2.1.4:compile

依赖项调解是您正在讨论的规则。这是maven管理可传递依赖项所遵循的规则之一。

它将根据pom中最近的定义将commons lang放入依赖树中

您可以在此处阅读所有规则:

因此,请引用他们的话:

依赖项中介-这决定了当遇到多个版本作为依赖项时,将选择工件的哪个版本。Maven选择了“最接近的定义”。也就是说,它使用依赖关系树中与项目最接近的依赖关系的版本。您总是可以通过在项目的POM中显式声明来保证版本

而且commons lang的依赖关系从未被移除,它在传递树中的位置已经改变。现在它已成为一个1级依赖项

[INFO] +- commons-lang:commons-lang:jar:2.6:compile
[INFO] \- net.sf.jasperreports:jasperreports:jar:6.5.1:compile
[INFO]    +- org.eclipse.jdt.core.compiler:ecj:jar:4.4.2:compile
[INFO]    +- org.codehaus.castor:castor-xml:jar:1.3.3:compile
[INFO]    |  +- org.codehaus.castor:castor-core:jar:1.3.3:compile
[INFO]    |  +- javax.inject:javax.inject:jar:1:compile
[INFO]    |  +- stax:stax:jar:1.2.0:compile
[INFO]    |  |  \- stax:stax-api:jar:1.0.1:compile
[INFO]    |  \- javax.xml.stream:stax-api:jar:1.0-2:compile
[INFO]    +- com.fasterxml.jackson.core:jackson-core:jar:2.1.4:compile

这很奇怪,不应该发生。这很奇怪,不应该发生。我们仍然需要从jasperreports中排除commons lang吗?我们仍然需要从jasperreports中排除commons lang吗?