2013-11-27 7 views
7

Buona giornata!java.lang.NoSuchFieldError: org.apache.http.message.BasicLineFormatter.INSTANCE

Ho bisogno di aiuto!

Sviluppo app per Android con integrazione IIS (SharePoint). E quando ho eseguito questo codice (codice 2), ottengo l'errore

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

corro questo codice in firstActivity nel metodo onCreate (codice 1)

Versione httpclient - 4.3;

Codice 1

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

Codice 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()); 
    } 
} 

Grazie per qualsiasi aiuto.

risposta

10

Google Android viene fornito con un fork estremamente obsoleto (pre BETA 4.0) di Apache HttpClient. A causa della presenza di classi vecchie sul classpath, la versione di HttpClient non viene inizializzata correttamente a meno che tutte le classi non vengano spostate in un altro spazio dei nomi ('org.apache.http' -> 'thank.you.google.http')

Un modo per assicurarsi che la versione originale di Apache HttpClient non si sovrapponga al suo spazio dei nomi originale è il riconfezionamento con lo Maven Shade plugin, utilizzare the port sviluppato da Dirk Boye o lo official port of Apache HttpClient to Google Android.

+0

grazie! come posso cambiare spazio dei nomi (spostalo in un'altra directory), se non ricompilare httpclient – G1yyK

+0

@ G1yyK: Questa è una domanda diversa, a cui è già stata data risposta in più di un'occasione. Ad ogni modo, ho aggiunto un'altra sezione alla mia risposta originale con i dettagli sulle opzioni di riconfezionamento. – oleg

+0

Mi sono imbattuto in un problema molto simile. Che cosa significa esattamente ripackeage HttpClient e come esattamente lo faccio (ho provato a cercarlo ma non c'è una guida su come farlo - almeno non riesco a trovarne uno) –

0

Per rimuovere Android tutti HttpClient e httpcore dipendenze e aggiungere

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

nel file build.gradle

Problemi correlati