Maven提取的版本低于pom.xml

时间:2016-11-11 10:44:31

标签: java maven

我有一个现有的Project X,我正在添加AWS SDK,但由于某种原因,它试图使用旧版本的Apache Commons httpclient并且爆炸了。

项目X在其httpclient中没有版本时已经需要pom.xml,并且AWS SDK v1.11.52将httpclient v4.5.2指定为依赖项。由于没有版本我在Project X的pom.xml中将版本设置为4.5.2。这成功编译,但是当我尝试在Tomcat托管的JSP页面中使用代码时,我收到此错误:

HTTP Status 500 - Handler processing failed; nested exception is java.lang.NoSuchMethodError: org.apache.http.conn.ssl.SSLConnectionSocketFactory.<init>(Ljavax/net/ssl/SSLContext;Ljavax/net/ssl/HostnameVerifier;)V

查看Tomcat中的lib目录,我看到httpclient v4.3的jar就在那里。我确认错误中的构造函数在v4.3中不存在,但在v4.5.2中确实存在。

我确保使用mvn clean,清除我的类路径文件,并尝试删除~/.m2,但是当我重建项目时,httpclient的v4.3仍然被拉入。我没有使用IDE,只是Maven。我检查了项目,以确保在任何地方都没有提到v4.3,所以我不明白为什么会这样。

我使用mvn depdency:tree -Dverbose检查了我的相关性信息。以下是相关部分,其他地方未提及httpclient

[INFO] +- org.apache.httpcomponents:httpclient:jar:4.5.2:compile
[INFO] |  +- org.apache.httpcomponents:httpcore:jar:4.3:compile (version managed from 4.4.4)
[INFO] |  +- commons-logging:commons-logging:jar:1.1.3:compile (version managed from 1.2)
[INFO] |  \- commons-codec:commons-codec:jar:1.9:compile
...
[INFO] |  +- com.amazonaws:aws-java-sdk-core:jar:1.11.52:compile
[INFO] |  |  +- (commons-logging:commons-logging:jar:1.1.3:compile - version managed from 1.2; omitted for duplicate)
[INFO] |  |  +- (org.apache.httpcomponents:httpclient:jar:4.3:compile - version managed from 4.5.2; omitted for conflict with 4.5.2)

为什么我的pom.xml个文件中没有提到的版本被拉入?我可以让maven更详细地解释version managed吗?最重要的是,有没有办法可以强制我的依赖项的版本号?

更新:问题是旧版本包含在父pom中;我错过了这个,无法从dependency:tree输出中找出答案。更新父pom解决了这个问题。抱歉误报。

1 个答案:

答案 0 :(得分:3)

如果没有直接依赖,但只有间接依赖,Maven会选择它找到的第一个,而这完全取决于完整依赖树的顺序。您可以通过以下方式强制使用您想要的版本:

旁注:如果碰到其他问题,也许你想更新httpclient的某些间接依赖项的版本。

如果您想了解更多内容,请查看此帖子。这里解释了很多信息:How do I tell Maven to use the latest version of a dependency?