【问题标题】:HttpClientBuilder - java.lang.NoSuchFieldError: INSTANCEHttpClientBuilder - java.lang.NoSuchFieldError: 实例
【发布时间】:2015-09-06 02:08:53
【问题描述】:

我有一个使用 HttpClient 执行 HTTP 请求的 Maven Java 项目。在我的本地 Java Web 服务器上一切正常。但是在我将其部署到 SAP Hana Cloud Platform 后,我收到以下错误:

java.lang.NoSuchFieldError: INSTANCE
at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:52)
at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:56)
at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<clinit>(DefaultHttpRequestWriterFactory.java:46)
at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:72)
at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:84)
at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<clinit>(ManagedHttpClientConnectionFactory.java:59)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$InternalConnectionFactory.<init>(PoolingHttpClientConnectionManager.java:493)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:149)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:138)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:114)
at org.apache.http.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:726)
at com.sap.hana.cloud.odata.service.OlingoSampleApp.getHttpclient(OlingoSampleApp.java:382)
at com.sap.hana.cloud.odata.service.OlingoSampleApp.getCsrfToken(OlingoSampleApp.java:374)
at com.sap.hana.cloud.odata.service.ODataCalls.doGet(ODataCalls.java:163)
...

我的依赖如下所示:

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.3.5</version>
    <scope>compile</scope>
</dependency>

根据这个问题java.lang.NoSuchFieldError: org.apache.http.message.BasicLineFormatter.INSTANCE from Mashape Unirest in Java application我尝试使用以下代码获取ClassLoader Ressource。

ClassLoader classLoader = this.getClass().getClassLoader();
URL resource = classLoader.getResource("org/apache/http/impl/client/HttpClientBuilder.class");
return resource;

它返回以下内容

"jar:file:/some/path/WEB-INF/lib/httpclient-4.3.5.jar!/org/apache/http/impl/client/HttpClientBuilder.class"

您可以看到 jar 版本是相同的。我看到的每个类似问题都有不连贯的 jar 版本作为失败的根源。这个错误还有其他原因吗?

更新

在 cmets 讨论后,我将更新我的问题:

依赖树:

所以现在我可以看到版本冲突,我删除了neo-java-web-api。 classLoader 现在再次返回版本 4.3.2。但我仍然从一开始就得到错误。

没有neo-java-web-api 的新的、完整的依赖树现在如下所示:

【问题讨论】:

  • 啊,但是冲突的类是BasicLineFormatter。尝试从原始问题中获取相同的 URL,而不是您要获取的 URL:URL resource = classLoader.getResource("org/apache/http/message/BasicLineFormatter.class");
  • 我以前也试过这个。回复是"jar:file:/some/path/WEB-INF/lib/httpcore-4.3.2.jar!/org/apache/http/message/BasicLineFormatter.class"。这和我的 httpcore 依赖是同一个版本。
  • 您能否删除httpcore 部门并重试。此 dep 已经在 httpclientpom 中。
  • 好的,现在版本是4.1.4。 "jar:file:some/pathWEB-INF/lib/httpcore-4.1.4.jar!/org/apache/http/message/BasicLineFormatter.class"
  • 但现在我有一个java.lang.ClassNotFoundException: org.apache.http.config.Lookup

标签: java maven http


【解决方案1】:

我仍然找不到实际问题的解决方案。但至少我可以找到解决方法。我将范围更改为&lt;scope&gt;provided&lt;/scope&gt;,并且只使用了功能,这些功能在版本 4.1.4 中也可用。例如new DefaultHttpClient(cm); 而不是HttpClientBuilder.create().build();

【讨论】:

    猜你喜欢
    • 2014-03-04
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    • 2018-09-15
    • 2015-04-23
    相关资源
    最近更新 更多