2015-06-20 3 views
3

У меня есть проект Maven Java, который использует HttpClient для выполнения HTTP-запросов. На моем локальном веб-сервере Java все работает нормально. Но после того, как я развернуть его в SAP Hana Cloud Platform я получаю следующее сообщение об ошибке:HttpClientBuilder - java.lang.NoSuchFieldError: INSTANCE

java.lang.NoSuchFieldError: INSTANCE 
at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:52) 
at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:56) 
at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<clinit>(DefaultHttpRequestWriterFactory.java:46) 
at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:72) 
at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:84) 
at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<clinit>(ManagedHttpClientConnectionFactory.java:59) 
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$InternalConnectionFactory.<init>(PoolingHttpClientConnectionManager.java:493) 
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:149) 
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:138) 
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:114) 
at org.apache.http.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:726) 
at com.sap.hana.cloud.odata.service.OlingoSampleApp.getHttpclient(OlingoSampleApp.java:382) 
at com.sap.hana.cloud.odata.service.OlingoSampleApp.getCsrfToken(OlingoSampleApp.java:374) 
at com.sap.hana.cloud.odata.service.ODataCalls.doGet(ODataCalls.java:163) 
... 

Моя зависимость выглядит следующим образом:

<dependency> 
    <groupId>org.apache.httpcomponents</groupId> 
    <artifactId>httpclient</artifactId> 
    <version>4.3.5</version> 
    <scope>compile</scope> 
</dependency> 

По этому вопросу java.lang.NoSuchFieldError: org.apache.http.message.BasicLineFormatter.INSTANCE from Mashape Unirest in Java application Я пытался использовать следующий код получить ClassLoader Ressource.

ClassLoader classLoader = this.getClass().getClassLoader(); 
URL resource = classLoader.getResource("org/apache/http/impl/client/HttpClientBuilder.class"); 
return resource; 

и возвращает следующее

"jar:file:/some/path/WEB-INF/lib/httpclient-4.3.5.jar!/org/apache/http/impl/client/HttpClientBuilder.class" 

Вы можете видеть, что банку-версии совпадают. Каждый похожий вопрос, на который я смотрел, имел некогерентные версии jar как источник неудачи. Может ли быть другая причина этой ошибки?

Update

После обсуждения в комментариях, я буду обновлять свой вопрос:

Завис дерево:

enter image description here

Так что теперь я мог видеть версию конфликта, и я удалены neo-java-web-api. КлассLoader теперь снова возвращает версию 4.3.2. Но я все еще получаю ошибку с самого начала.

Новое, полное дерево зависимостей без neo-java-web-api теперь выглядит следующим образом: enter image description here

+0

Ах, но класс в конфликте - BasicLineFormatter. Вместо URL-адреса, который вы захватываете, попробуйте взять тот же из исходного вопроса: 'URL resource = classLoader.getResource (" org/apache/http/message/BasicLineFormatter.class ");' – Pace

+0

Я также пробовал это раньше , Ответ: «jar: file: /some/path/WEB-INF/lib/httpcore-4.3.2.jar !/org/apache/http/message/BasicLineFormatter.class». Это та же версия, что и моя зависимость httpcore. – Recobe

+0

Можете ли вы удалить "httpcore' dep и повторите попытку. Этот фрагмент уже находится в папке [pom] (https://repo1.maven.org/maven2/org/apache/httpcomponents/httpclient/4.3.5/httpclient-4.3.5.pom) 'httpclient'. –

ответ

2

Я до сих пор не удалось найти решение для конкретной задачи. Но, по крайней мере, я мог найти обходное решение. Я изменил область действия на <scope>provided</scope> и использовал только функции, которые также доступны в версии 4.1.4. Например, new DefaultHttpClient(cm); вместо HttpClientBuilder.create().build();

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