2015-11-12 2 views
1

У меня есть приложение Java (как проект Maven), которое использует HttpClient (v 4.5) для доступа к REST API, а затем записывает ответ GET в HDFS как JSON , Это прекрасно работает, когда в Eclipse IDE. Вот моя зависимость:java.lang.NoSuchFieldError: INSTANCE в HttpClient при запуске Oozie

<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. Таким образом, потенциальным виновником может быть зависимость HttpClient от hadoop-client (только моя догадка). Как я могу определить, является ли конфликт множественной версии? Если да, то как мне его решить?

Если нет, есть ли альтернативное решение при открытии HttpClient, чтобы избежать этой проблемы? Должен ли я использовать библиотеку, отличную от HttpClient?

+0

Посмотрите на свой класс, чтобы проверить библиотеки. – LEQADA

ответ

0

Первый вариант, который работал для меня, - использовать Джерси вместо HttpClient. Поскольку hasoop-клиент уже использует jersey-core и jersey-client в качестве зависимости, он может использовать уже существующее. Кроме того, я обновил hasoop-client до 2.6.0, так как версия Hadoop у меня - 2.6.0.

Затем, когда я удалил http-client в pom.xml, я заметил, что http-client, версия 4.2.5, неожиданно появляется. Он подтверждает, что hasoop-клиент также имеет в себе зависимость, как я подозревал ранее. Поэтому, когда я вернулся к решению HttpClient и скорректировал некоторые строки в соответствии с более старой версией, он успешно работает в Oozie.

Смежные вопросы