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

时间:2015-05-08 20:58:29

标签: java maven jar maven-3

我在我的模块上运行了maven依赖:树。以下是此输出的摘录。

[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

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

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

我也没有看到这个jar位于'引用的图书馆'或者' maven依赖'在Eclipse中。我的项目Base64Util来自commons-codec,它编译得很好。

1 个答案:

答案 0 :(得分:1)

依赖关系在POM中定义,如您所见:

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

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

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

因此maven输出正确并且将提供库。现在,如果您在代码中使用此库中的类,我建议您在pom中使用明确的依赖项。

Maven构建这个依赖关系树以查看需要哪些库,因为每个jar只包含它自己的类而不是依赖项。 Maven将验证,如果多个库询问相同的依赖关系,那么使用的版本将适用于两个库。有时它无法找到解决方案,并且会在依赖性解析错误的情况下将其抛向空中。如果它有库列表,它将下载它们并将它们放在java类路径上进行编译等...

这是必需的,因为普通的java类加载器将所有类放在同一名称空间中。情况并非总是如此,例如servlet容器为每个war创建一个类加载器,osgi容器每个bundle一个,但是所有这些系统都需要付出代价:奇怪的ClassCast异常,因为一个类被加载到多个类加载器中。这就是为什么jar不包含它们在自包含uberjar中的依赖关系。