2013-11-27 5 views
7

Добрый день!java.lang.NoSuchFieldError: org.apache.http.message.BasicLineFormatter.INSTANCE

Мне нужна помощь!

Я разрабатываю приложение для Android с интеграцией IIS (SharePoint). И когда я запускаю этот код (код 2), я получаю ошибку

java.lang.NoSuchFieldError: org.apache.http.message.BasicLineFormatter.INSTANCE

я запускаю этот код в firstActivity в методе OnCreate (код 1)

Версия HttpClient - 4,3;

Код 1

new Thread(new Runnable() { 
      @Override 
      public void run() { 
        new HttpsClietn(); 
    } 
}).run(); 

Код 2

package com.example.HttpsMy; 

import android.os.Environment; 
import org.apache.http.auth.AuthScope; 
import org.apache.http.auth.NTCredentials; 
import org.apache.http.client.CredentialsProvider; 
import org.apache.http.client.HttpClient; 

import org.apache.http.client.methods.HttpGet; 
import org.apache.http.client.protocol.HttpClientContext; 
import org.apache.http.conn.ssl.SSLConnectionSocketFactory; 
import org.apache.http.impl.client.BasicCredentialsProvider; 
import org.apache.http.impl.client.HttpClientBuilder; 


import javax.net.ssl.KeyManagerFactory; 
import javax.net.ssl.SSLContext; 
import javax.net.ssl.TrustManager; 
import javax.net.ssl.X509TrustManager; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.security.*; 
import java.security.cert.CertificateException; 
import java.security.cert.X509Certificate; 

public class HttpsClietn { 
    HttpsClietn() throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException, IOException, CertificateException, UnrecoverableKeyException { 

     CredentialsProvider credsProvider = new BasicCredentialsProvider(); 
     credsProvider.setCredentials(AuthScope.ANY, new NTCredentials("Grigoriy.Polyakov","password", "", "domain.kz")); 

     HttpClientContext context = HttpClientContext.create(); 
     context.setCredentialsProvider(credsProvider); 

     HttpGet httpget = new HttpGet("https://serveer.domain.kz"); 


     HttpClient client = HttpClientBuilder.create() 
       .setSSLSocketFactory(getFactory()) 
       .setDefaultCredentialsProvider(credsProvider) 
       .setSslcontext(getContext()) 
       .build(); 

     System.out.println(client.execute(httpget,context).getStatusLine()); 

    } 

    SSLContext getContext() throws NoSuchAlgorithmException, KeyStoreException, IOException, KeyManagementException, CertificateException, UnrecoverableKeyException { 
     //new File("key/keystore.p12"), "1234" 
     KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
     KeyStore keyStore = KeyStore.getInstance("PKCS12"); 

     InputStream keyInput = new FileInputStream(new File(Environment.getExternalStorageDirectory().getPath()+"/kvv/keystore.p12")); 
     keyStore.load(keyInput, "1234".toCharArray()); 
     keyInput.close(); 

     keyManagerFactory.init(keyStore, "1234".toCharArray()); 

     TrustManager[] trustAllCerts = new TrustManager[]{ 
       new X509TrustManager() { 
        @Override 
        public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { 
        } 

        public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
         return null; 
        } 

        public void checkServerTrusted(X509Certificate[] certs, String authType) { 
        } 
       } 
     }; 

     SSLContext context = SSLContext.getInstance("TLS"); 
     context.init(keyManagerFactory.getKeyManagers(), trustAllCerts, new SecureRandom()); 

     return context; 
    } 

    SSLConnectionSocketFactory getFactory() throws CertificateException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyStoreException, KeyManagementException, IOException { 
     return new SSLConnectionSocketFactory(getContext()); 
    } 
} 

Спасибо за любую помощь.

ответ

10

Google Android поставляется с чрезвычайно устаревшей (pre BETA 4.0) вилкой Apache HttpClient. Из-за наличия старых классов в пути к классам версия HttpClient не может правильно инициализироваться, если все классы не перемещены в другое пространство имен ('org.apache.http' -> 'thank.you.google.http')

Один из способов убедиться, что версия запаса Apache HttpClient не перекрывается с исходным пространством имен, переупаковывает его с помощью Maven Shade plugin, используйте the port, разработанный Dirk Boye, или official port of Apache HttpClient to Google Android.

+0

спасибо! как я могу изменить пространство имен (переместите это в другой каталог), если не перекомпилировать httpclient – G1yyK

+0

@ G1yyK: Это другой вопрос, на который был дан ответ уже не один раз. Во всяком случае, я добавил еще один раздел в свой первоначальный ответ с подробными сведениями о вариантах переупаковки. – oleg

+0

Я столкнулся с очень похожим вопросом. Что именно означает переупаковать HttpClient и как именно я это делаю (я попытался найти его, но нет руководства о том, как это сделать - по крайней мере, я не смог его найти) –

0

Для андроида Удалить все HTTPClient и httpcore зависимостей и добавить

compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1' // gradle depedencies 

в файле build.gradle

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