java apache-httpclient-4.x

Ejemplo de HTTPClient-Excepción en el hilo "main" java.lang.NoSuchFieldError: INSTANCE



apache-httpclient-4.x (8)

Causado por: java.lang.NoSuchFieldError: INSTANCE

una de las soluciones de java.lang.NoSuchFieldError: INSTANCE : Esto sucede si tenemos dos versiones diferentes de la misma clase en nuestro classpath ... […], Así que primero encontramos esa clase (una versión de la clase), hacemos clic en esa clase, seleccionamos "crear ruta", luego hacemos clic en "eliminar de la ruta de compilación". por 333ccc333

Estoy usando componentes HttpClient de Apache para el siguiente programa simple y veo la siguiente excepción:

Exception in thread "main" java.lang.NoSuchFieldError: INSTANCE at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.(DefaultHttpRequestWriterFactory.java:52) at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.(DefaultHttpRequestWriterFactory.java:56) at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.(DefaultHttpRequestWriterFactory.java:46) at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.(ManagedHttpClientConnectionFactory.java:72) at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.(ManagedHttpClientConnectionFactory.java:84) at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.(ManagedHttpClientConnectionFactory.java:59) at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$InternalConnectionFactory.(PoolingHttpClientConnectionManager.java:487) at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.(PoolingHttpClientConnectionManager.java:147) at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.(PoolingHttpClientConnectionManager.java:136) at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.(PoolingHttpClientConnectionManager.java:112) at org.apache.http.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:726) at com.starwood.rms.controller.property.HttpExample.main(HttpExample.java:14)

public class HttpExample { public static void main(String[] args) { HttpClient client = HttpClientBuilder.create().build(); HttpGet request = new HttpGet("https://www.google.com/?q=java"); try { HttpResponse response = client.execute(request); System.out.println(response.getStatusLine()); } catch (Exception e) { e.printStackTrace(); } } }

estoy usando

  • Httpclient-4.3.3.jar
  • Httpcore-4.3.2.jar

¿Algunas ideas?


Este código funciona ... sin ningún error ... verifique los paquetes si está utilizando una importación similar.

package com.jai.http; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.HttpClientBuilder; public class HttpExample { /** * @param args */ public static void main(String[] args) { HttpClient client = HttpClientBuilder.create().build(); HttpGet request = new HttpGet("https://www.google.com/?q=java"); try { HttpResponse response = client.execute(request); System.out.println(response.getStatusLine()); } catch (Exception e) { e.printStackTrace(); } } }


Mirando el código fuente de DefaultHttpRequestWriterFactory

package org.apache.http.impl.io; import org.apache.http.HttpRequest; import org.apache.http.annotation.Immutable; import org.apache.http.io.HttpMessageWriter; import org.apache.http.io.HttpMessageWriterFactory; import org.apache.http.io.SessionOutputBuffer; import org.apache.http.message.BasicLineFormatter; import org.apache.http.message.LineFormatter; @Immutable public class [More ...] DefaultHttpRequestWriterFactory implements HttpMessageWriterFactory<HttpRequest> { public static final DefaultHttpRequestWriterFactory INSTANCE = new DefaultHttpRequestWriterFactory(); private final LineFormatter lineFormatter; public [More ...] DefaultHttpRequestWriterFactory(final LineFormatter lineFormatter) { super(); this.lineFormatter = lineFormatter != null ? lineFormatter : BasicLineFormatter.INSTANCE; } public [More ...] DefaultHttpRequestWriterFactory() { this(null); } public HttpMessageWriter<HttpRequest> [More ...] create(final SessionOutputBuffer buffer) { return new DefaultHttpRequestWriter(buffer, lineFormatter); } }

¿Estás seguro de que estás utilizando HttpCore 4.3.2? DefaultHttpRequestWriterFactory intenta resolver

BasicLineFormatter.INSTANCE

Campo pero no puede encontrarlo.

Busque en su ruta de clase las bibliotecas que podrían contener otra clase BasicLineFormatter , tal vez tenga un HttpCore de una versión antigua en conflicto con la versión 4.3.2.


Para aquellos que usan Webpshere, asegúrese de que su política de carga de clases esté configurada en "Último padre", de lo contrario no funcionará ya que WAS está utilizando su propia versión de commons http, que puede ser conflictiva.


También me sentí frustrado por esto y por Eclipse hasta que me di cuenta de que, al igual que con el consejo Webpshere de Pat B, causa problemas para Eclipse si tiene las dependencias en el orden incorrecto.

Properties -> Java Build Path -> Order and Export

Juega un poco por aquí con el orden del núcleo y el cliente.


También tuve este problema, me di cuenta de que era cuando actualizábamos a java 1.8, acabo de bajar a 1.7 y funciona como se esperaba. No estoy seguro de por qué la versión se convirtió en un problema.


Tuve este problema Parece que hay un problema al inicializar HttpClient con HttpClientBuilder.create (). Build (). Si desea una solución más inmediata, simplemente use el nuevo DefaultHttpClient () para inicializar HttpClient.

HttpClient client = new DefaultHttpClient();


Tuve este problema con Hadoop. Usó una versión anterior de httpclient-4.2.5.jar y httpcore-4.2.5.jar en su httpcore-4.2.5.jar compartida.

Resolví esto sombreando partes a través del maven-shade-plugin

<relocations> <relocation> <pattern>org.apache.http</pattern> <shadedPattern>shaded.org.apache.http</shadedPattern> </relocation> </relocations>