Maven 依赖树显示父 jar 中不存在的依赖关系?

maven dependency tree showing dependency that is not present in parent jar?

我在我的模块上 运行 maven dependency:tree。这是此输出的片段。

[INFO] +- org.springframework:spring-webmvc:jar:4.0.2.RELEASE:compile
[INFO] |  +- org.springframework:spring-beans:jar:4.0.2.RELEASE:compile
[INFO] |  +- org.springframework:spring-expression:jar:4.0.2.RELEASE:compile
[INFO] |  \- org.springframework:spring-web:jar:4.0.2.RELEASE:compile
[INFO] +- javax.servlet:javax.servlet-api:jar:3.0.1:provided
[INFO] +- org.apache.httpcomponents:httpcore:jar:4.3.2:compile
[INFO] +- org.apache.httpcomponents:httpclient:jar:4.3.2:compile
[INFO] |  \- commons-codec:commons-codec:jar:1.6:compile
[INFO] +- org.apache.commons:commons-lang3:jar:3.2.1:compile
[INFO] +- commons-lang:commons-lang:jar:2.6:compile
[INFO] +- com.fasterxml.jackson.core:jackson-core:jar:2.5.0:compile
[INFO] +- com.fasterxml.jackson.core:jackson-annotations:jar:2.5.0:compile
[INFO] +- com.fasterxml.jackson.core:jackson-databind:jar:2.5.0:compile
[INFO] +- com.newrelic.agent.java:newrelic-api:jar:3.6.0:compile

我从 org.apache.httpcomponents:httpclient:jar:4.3.2 看到 transitive dependencycommons-codec:commons-codec:jar:1.6

但我在 $M2_HOME/org/apache/httpcomponents/httpclient/4.3.2/httpclient-4.3.2.jar 中找不到这个罐子。

我也没有在 Eclipse 中的 'referenced Libraries' 或 'maven dependencies' 中看到这个 jar。我的项目 Base64Util class 来自 commons-codec 并且编译正常。

如您在此处所见,依赖项在 POM 中定义:

http://central.maven.org/maven2/org/apache/httpcomponents/httpclient/4.3.2/httpclient-4.3.2.pom

存在对 commons-codec 的编译依赖。它有一个对 httpcomponents-client 的父 pom 引用,它将版本定义为 1.6,如下所示:

http://central.maven.org/maven2/org/apache/httpcomponents/httpcomponents-client/4.3.2/httpcomponents-client-4.3.2.pom

所以maven输出是正确的,会提供库。现在,如果您在代码中使用此库中的 class,我建议您在 pom 中有一个显式依赖项。

Maven 构建此依赖关系树以查看需要哪些库,因为每个 jar 仅包含其自己的 classes 而不是依赖关系。 Maven 将验证如果多个库请求相同的依赖项,则使用的版本将适用于两个库。有时它找不到解决方案,会因依赖项解析错误而举手投降。当它有库列表时,它将下载它们并将它们放在 java class 编译路径等...

这是必需的,因为正常的 java classloader 将所有 classes 放在同一个命名空间中。情况并非总是如此,例如servlet 容器每个 war 一个 classloader,每个 bundle 一个 osgi 容器,但是所有这些系统都是有代价的:奇怪的 ClassCast 异常,因为 class 被加载到多个 class装载机。这就是为什么 jars 不在自包含 uberjar.

中包含它们的依赖项的原因