【问题标题】:maven dependency tree showing dependency that is not present in parent jar?maven依赖树显示父jar中不存在的依赖关系?
【发布时间】:2015-07-19 21:30:33
【问题描述】:

我在我的模块上运行了 maven dependency:tree。这是这个输出的sn-p。

[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 中找不到这个罐子。

我也没有看到这个 jar 位于 Eclipse 的“引用库”或“maven 依赖项”中。我的项目Base64Util 来自commons-codec 的类,它编译得很好。

【问题讨论】:

    标签: java maven jar maven-3


    【解决方案1】:

    如您在此处看到的,在 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输出是正确的,会提供库。现在,如果您在代码中使用此库中的类,我建议您在 pom 中明确依赖。

    Maven 构建这个依赖树来查看需要哪些库,因为每个 jar 只包含自己的类而不包含依赖项。 Maven 将验证如果多个库请求相同的依赖项,那么使用的版本将与两个库一起使用。有时它找不到解决方案,并且会因依赖解析错误而举手投足。当它拥有库列表时,它将下载它们并将它们放在 java 类路径中进行编译等...

    这是必需的,因为普通的 java 类加载器会将所有类放在同一个命名空间中。情况并非总是如此,例如servlet 容器在每次战争中生成一个类加载器,osgi 容器在每个捆绑包中生成一个,但是所有这些系统都是有代价的:奇怪的 ClassCast 异常,因为一个类被加载到多个类加载器中。这就是 jar 不将它们的依赖项包含在自包含的 uberjar 中的原因。

    【讨论】:

    • 我不是在质疑 Maven 输出。但我想知道为什么 httpclient 的 jar 不包含 commons-codec,因为它是依赖的?
    • 这不是 maven(或 java)的工作方式。所有的库都单独存放在maven仓库中,在执行前下载并放到java类路径中。
    • 我更新了我的答案以解释为什么 jar 不包含它们的依赖项。
    • 太棒了!。我看到我的项目已经下载了多个版本的codec jar,可能每个 maven 依赖项都在使用不同版本的codec..不确定这是否是一个好习惯?但这是我无法控制的,因为依赖可能取决于特定的 codec 版本..
    • 在实践中是没有问题的。让 maven 处理选择最佳版本。除非您使用不同年龄的 jar,否则依赖项应该足够接近,以便 maven 可以找到匹配项。非常特殊的是,您必须告诉 maven 从您的一个依赖项中“排除”一个临时依赖项以打破僵局。
    猜你喜欢
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 2011-10-27
    • 2012-07-04
    • 1970-01-01
    相关资源
    最近更新 更多