簡體   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