java.lang.NoSuchFieldError:INSTANCE

时间:2014-02-07 08:36:01

标签: java spring httpclient apache-storm

尝试通过StormSubmitter提交我的拓扑时,我得到了 -

Caused by: java.lang.NoSuchFieldError: INSTANCE  
at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:52)

我正在使用Spring。

我没有在Spout / Bolt构造函数中初始化HttpClient。相反,它在一个类的构造函数中初始化,该类是从prepare() bolt方法中的Spring Context获取的

代码结构如下 -

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 个答案:

答案 0 :(得分:17)

这可能是一个依赖问题。

这是一个非常不清楚的错误消息,但我发现类似的东西: Hibernate NoSuchFieldError INSTANCE but only with Struts 1?

答案 1 :(得分:9)

我遇到类似这样的问题,在我的类路径中有两个jar包含相同的类,httpcore-4.3和apache-httpcomponents-httpcore,我已经从类路径中删除了apache-httpcomponents-httpcore解决了这个问题。

答案 2 :(得分:1)

苛刻是风暴阶级的道路。

所以我做的工作就是删除风暴附带的httpclient和httpcore,并分别用更新版本的4.3.3和4.3.2替换它们。这会更改works / nimbus / supervisor用于启动的类路径。您可以运行storm classpath并打印出类路径。

[nimbus ~]$ storm classpath
...../storm-0.8.2/lib/httpclient-4.3.3.jar:..../storm-0.8.2/lib/httpcore-4.3.2.jar.....

我不确定这是一个非常好的工作,我不确定风暴的哪个部分使用这个罐子。

如果你看一下python storm代码,你会发现它会把所有的jar都放在暴风根和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))

答案 3 :(得分:1)

我在插件文件夹里面的路径中有以下jar文件:
./ VAR / LIB /詹金斯/插件/集结流水线插件/ 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

之后,我删除了下面的文件,它对我有用 的 /var/lib/jenkins/plugins/build-pipeline-plugin/WEB-INF/lib/httpcore-4.2.1.jar