【问题标题】:java.lang.NoSuchFieldError: INSTANCEjava.lang.NoSuchFieldError:实例
【发布时间】:2014-03-04 13:52:01
【问题描述】:

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

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

我正在使用 Spring。

我没有在 Spout/Bolt 构造函数中初始化 HttpClient。而是在 prepare() 螺栓方法中从 Spring 上下文中获取的类的构造函数中初始化

代码结构如下-

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);
    }
}

【问题讨论】:

  • 可能是依赖问题,见stackoverflow.com/questions/5106520/…
  • @K.C.感谢您的评论。这似乎是 httpcore:4.2 和 4.3 都在 uberjar 中的问题。但即使解决了这个问题,也没有解决问题。
  • @K.C.看来,这实际上是问题所在。我们的storm包提供httpcore-4.2.5(因此以storm jar /path/to/jar.jar运行任何东西都会有重复的依赖。[请添加您的评论作为答案,我会接受它]
  • 谢谢,我赞成你的问题。

标签: java spring httpclient apache-storm


【解决方案1】:

这可能是一个依赖问题。

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

【讨论】:

  • 这实际上是问题所在。我们的storm包提供httpcore-4.2.5(因此以storm jar /path/to/jar.jar运行任何东西会导致重复依赖问题。)
  • 有人知道吗?我也有同样的问题。
  • @lockwobr,问题是当我们依赖 httpcore-4.3 时,storm 提供了 httpcore-4.2.5。我们升级了 Storm 库中的 httpcore jar 来解决这个问题。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    Harsh 在风暴类路径中是正确的。

    所以我为完成这项工作所做的就是删除了 Storm 附带的 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.....
    

    我不确定这是一个很好的解决方法,我不确定storm的哪个部分使用了这个jar。

    如果您查看 python storm 代码,您会发现它会将所有 jar 放入storm root 和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))
    

    【讨论】:

      【解决方案4】:

      我在插件文件夹内的路径中有以下 jar 文件:
      ./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

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

      【讨论】:

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