Java.lang.NoSuchFieldError: INSTANCE
en essayant de soumettre ma topologie par StormSubmitter, je reçois -
Caused by: java.lang.NoSuchFieldError: INSTANCE
at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:52)
J'utilise le ressort.
Je n'initialise pas HttpClient dans le constructeur de bec/Boulon. Au lieu de cela, son initialisé dans constructeur d'une classe qui est récupéré à partir du contexte de ressort dans prepare()
méthode de boulon
est structuré comme suit:"
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);
}
}
4 réponses
il s'agit probablement d'un problème de dépendance.
c'est un message d'erreur très imprécis mais j'ai trouvé quelque chose de similaire ici: Hibernate NoSuchFieldError INSTANCE mais seulement avec des Struts 1?
j'ai fait face à un problème similaire comme celui-ci, dans mon chemin de classe il y avait deux jar contenant la même classe, httpcore-4.3 et apache-httpcomponents-httpcore, j'ai supprimé apache-httpcomponents-httpcore du chemin de classe résolu le problème.
Harsh est juste dans le chemin de la classe de tempête.
donc ce que j'ai fait pour faire ce travail a été supprimer le httpclient et le httpcore qui vient avec storm et les a remplacés par la nouvelle version 4.3.3 et 4.3.2 respectivement. Cela change le chemin de classe que le workplace/nimbus / supervisor utilise pour commencer. Vous pouvez exécuter storm classpath et il imprime le chemin de la classe.
[nimbus ~]$ storm classpath
...../storm-0.8.2/lib/httpclient-4.3.3.jar:..../storm-0.8.2/lib/httpcore-4.3.2.jar.....
Je ne suis pas sûr que ce soit un très bon travail autour, Je ne suis pas sûr quelle partie de tempête utilise ce pot.
si vous regardez le code python storm vous voyez qu'il va mettre toutes les jarres dans la racine de la tempête et 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))
j'avais les fichiers jar ci-dessous dans le chemin à l'intérieur du dossier plugin:
./ 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
après, j'ai enlevé le fichier ci-dessous, il a fonctionné pour moi
/var/lib/jenkins/plugins/build-pipeline-plugin/WEB-INF/lib/httpcore-4.2.1.jar