【发布时间】:2018-11-23 18:56:52
【问题描述】:
我有一个相当大的遗留项目,我正在向其中添加一个组件。该组件使用HtmlUnit。我可以用 Maven 编译它,但是当我运行它时,我得到:
java.lang.NoSuchMethodError:
org.apache.http.conn.ssl.SSLConnectionSocketFactory.<init>
(Ljavax/net/ssl/SSLContext;[Ljava/lang/String;[Ljava/lang/String;Ljavax/net/ssl/HostnameVerifier;)
所以它缺少正确的构造函数。我认为这几乎可以肯定是httpclient 中的版本冲突,但我不确定如何解决它。这是我的pom.xml 的相关部分(注意我一直在尝试使用排除和依赖管理的所有游戏):
<dependencies>
<dependency>
<groupId>com.mycompany.mine</groupId>
<artifactId>my-base-project</artifactId>
<version>${project.version}</version>
<exclusions>
<exclusion>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.mycompany</groupId>
<artifactId>base-project</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
</dependencies>
</dependencyManagement>
有什么想法吗?
编辑:有人建议这个问题与this one 重复,但不是因为这种情况下的依赖类型不是war。
【问题讨论】:
-
您是否尝试过
mvn dependency:tree以确保没有使用其他版本的org.apache.httpcomponents? -
您是否检查了 4.5.2 版本是否包含正确的构造函数?我在网上查看了 4.5 的来源,那些说最后一个参数的类型是
org.apache.http.conn.ssl.X509HostnameVerifier而不是javax.net.ssl.HostnameVerifier,所以这可能是个问题(或者 4.5.2 在这里发生了变化)。 - 您使用的是哪个版本的 Maven?我的印象是 Maven 2.x 在解决版本冲突方面有一些困难,而 Maven 3.x 似乎做得很好。 -
@Thomas 看起来它确实有那个构造函数:hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/…。我正在使用 Maven 版本 3.3.9。
-
按照 StephaneM 的建议,尝试使用 maven.apache.org/plugins/maven-dependency-plugin/examples/…dependency plugin;无论如何,只要在您正在运行的项目中指定依赖项,它就应该使用正确的依赖项,因为 Maven 通过最接近根目录解析