java.lang.NoSuchFieldError: INSTANCE
spring httpclient (4)
Cuando trato de enviar mi topología a través de StormSubmitter, estoy obteniendo ...
Caused by: java.lang.NoSuchFieldError: INSTANCE
at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:52)
Estoy usando Spring.
No estoy inicializando HttpClient en Spout / Bolt Constructor. En su lugar, se inicializa en el constructor de una clase que se va a buscar desde Spring Context en el método de cálculo de prepare()
El código está estructurado de la siguiente manera:
SomeBolt.java
@Component
public class SomeBolt extends BaseRichBolt {
private OutputCollector _collector;
private SomeClient someClient;
@Override
public void prepare(Map conf, TopologyContext context, OutputCollector collector) {
_collector = collector;
someClient = AppContext.getBean(SomeClient.class);
}
}
SomeClient.java
@Component
public class SomeClient {
private final CloseableHttpClient httpClient;
public SomeClient() {
this.httpClient = (httpClient == null ? HttpClients.createDefault() : httpClient);
}
}
AppContext.java
@Component
public class AppContext implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
AppContext.applicationContext = applicationContext;
}
public static <T> T getBean(Class<T> c) {
return applicationContext.getBean(c);
}
}
Este es probablemente un problema de dependencia.
Es un mensaje de error muy claro pero encontré algo similar aquí: Hibernate NoSuchFieldError INSTANCE pero solo con Struts 1?
Harsh tiene razón, está en el camino de clase de la tormenta.
Entonces, lo que hice para que esto funcionara fue eliminar el httpclient y el httpcore que viene con storm y reemplazarlos con la versión más nueva 4.3.3 y 4.3.2, respectivamente. Esto cambia la classpath que works / nimbus / supervisor usa para comenzar. Puede ejecutar classpath de tormenta e imprimir la ruta de clase.
[nimbus ~]$ storm classpath
...../storm-0.8.2/lib/httpclient-4.3.3.jar:..../storm-0.8.2/lib/httpcore-4.3.2.jar.....
No estoy seguro de que este sea un buen trabajo, no estoy seguro de qué parte de la tormenta usa este contenedor.
si miras el código de la storm pitón, ves que pondrá todos los frascos en la raíz de la tormenta y storm / lib
def get_classpath(extrajars):
ret = get_jars_full(STORM_DIR)
ret.extend(get_jars_full(STORM_DIR + "/lib"))
ret.extend(extrajars)
return normclasspath(":".join(ret))
Me enfrenté a un problema similar al siguiente, en mi ruta de clase había dos jar que contenían la misma clase, httpcore-4.3 y apache-httpcomponents-httpcore, eliminé apache-httpcomponents-httpcore de classpath, resolvió el problema.
Tenía los archivos jar a continuación en la ruta dentro de la carpeta del complemento:
./var/lib/jenkins/plugins/build-pipeline-plugin/WEB-INF/lib/httpcore-4.2.1.jar
./var/lib/jenkins/plugins/git-client/WEB-INF/lib/httpcore-4.3.2.jar
./var/lib/jenkins/plugins/maven-plugin/WEB-INF/lib/httpcore-4.2.4.jar
Después, eliminé el archivo de abajo, funcionó para mí
/var/lib/jenkins/plugins/build-pipeline-plugin/WEB-INF/lib/httpcore-4.2.1.jar