我有一个现有的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解决了这个问题。抱歉误报。
答案 0 :(得分:3)
如果没有直接依赖,但只有间接依赖,Maven会选择它找到的第一个,而这完全取决于完整依赖树的顺序。您可以通过以下方式强制使用您想要的版本:
旁注:如果碰到其他问题,也许你想更新httpclient的某些间接依赖项的版本。
如果您想了解更多内容,请查看此帖子。这里解释了很多信息:How do I tell Maven to use the latest version of a dependency?