繁体   English   中英

java.lang.NoSuchFieldError:运行Oozie时在HttpClient中实例化

[英]java.lang.NoSuchFieldError: INSTANCE in HttpClient when running Oozie

我有一个Java应用程序(作为Maven项目),在访问REST API时使用HttpClient(v 4.5),然后将GET响应作为JSON写入HDFS中。 在Eclipse IDE中,这可以正常工作。 这是我的依赖项:

<dependencies>
  <dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5</version>
  </dependency>
  <dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.3.1</version>
  </dependency>
  <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>2.2.0</version>
</dependency>

当我尝试将其与Oozie集成时,由于我计划定期进行REST API调用和HDFS写入,因此遇到:

Caused by: java.lang.NoSuchFieldError: INSTANCE
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.<clinit>(SSLConnectionSocketFactory.java:144)
at org.apache.http.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:955)
at com.accenture.pdc.digital.sf.datascience.RestController.<init> RestController.java:26)
at com.accenture.pdc.digital.sf.datascience.App.main(App.java:53)

(RestController.java和App.java是我的类)。 当我跟踪时,问题出在我的代码的这一行:

CloseableHttpClient httpClient = HttpClients.createDefault();

在进一步探究库源代码时,已弃用了以下内容:

AllowAllHostnameVerifier.INSTANCE

当我搜索同一问题时,有人说这可能是HttpClient或HttpCore的多个版本冲突。 因此,可能的罪魁祸首可能是hadoop-client的HttpClient依赖关系(这只是我的直觉)。 如何判断是否存在多个版本冲突? 如果是,该如何解决?

如果没有,打开HttpClient是否有其他解决方案来避免此问题? 我应该使用HttpClient以外的库吗?

对我有用的第一种选择是使用Jersey而不是HttpClient。 由于hadoop-client已经使用jersey-core和jersey-client作为依赖项,因此不妨使用现有的东西。 另外,我将hadoop-client升级到2.6.0,因为我拥有的Hadoop版本是2.6.0。

然后,当我删除pom.xml中的http-client时,我注意到突然出现了http-client 4.2.5版本。 正如我之前所怀疑的,它确认hadoop-client也将其作为依赖项。 因此,当我恢复到HttpClient解决方案,并调整了一些行使其适合旧版本时,它就可以在Oozie中成功运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM