Android Gradle Apache HttpClient non esiste?


263

Sto cercando di convertire un progetto IntelliJ nel sistema Gradle di Android Studio ma sto riscontrando errori con Apache HttpClient? Mi sto perdendo qualcosa, gli errori che sto riscontrando sono i seguenti:

Error:(10, 30) error: package org.apache.http.client does not exist
Error:(11, 30) error: package org.apache.http.client does not exist
Error:(12, 37) error: package org.apache.http.client.entity does not exist
Error:(13, 38) error: package org.apache.http.client.methods does not exist
Error:(14, 38) error: package org.apache.http.client.methods does not exist
Error:(15, 38) error: package org.apache.http.client.methods does not exist
Error:(16, 35) error: package org.apache.http.impl.client does not exist
Error:(134, 33) error: cannot find symbol class HttpUriRequest
Error:(164, 39) error: cannot find symbol class HttpUriRequest
Error:(106, 17) error: cannot find symbol class HttpGet
Error:(106, 39) error: cannot find symbol class HttpGet
Error:(117, 17) error: cannot find symbol class HttpPost
Error:(117, 40) error: cannot find symbol class HttpPost
Error:(125, 43) error: cannot find symbol class UrlEncodedFormEntity
Error:(135, 9) error: cannot find symbol class HttpClient
Error:(135, 33) error: cannot find symbol class DefaultHttpClient
Error:(155, 18) error: cannot find symbol class ClientProtocolException
Error:(165, 9) error: cannot find symbol class HttpClient
Error:(165, 33) error: cannot find symbol class DefaultHttpClient
Error:(185, 18) error: cannot find symbol class ClientProtocolException

Il mio file build.gradle ha le seguenti dipendenze:

dependencies {
    compile 'com.google.android.gms:play-services:+'
    compile 'org.apache.httpcomponents:httpclient:4.2.6'
    compile 'org.apache.httpcomponents:httpmime:4.2.6'
    compile files('libs/core.jar')
}

Sembra che molte persone stiano riscontrando un problema simile, ma né SO né Google hanno una soluzione, quindi spero che questa domanda possa aiutare i futuri ricercatori.

Risposte:


39

Ti suggerisco di sostituire l'apache deprecato HttpClient con il nuovo HttpURLConnection.

È una soluzione più pulita, è abbastanza facile migrare e generalmente è meglio attenersi alle ultime modifiche all'SDK piuttosto che provare a hackerare / correggere / risolvere il problema: di solito te ne pentirai più tardi :)

Passo 1

HttpGet httpGet = new HttpGet(url);

diventa:

URL urlObj = new URL(url);

Passo 2

HttpClient httpClient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
HttpResponse response = httpClient.execute(httpGet, localContext);
InputStream is = response.getEntity().getContent();

diventa:

HttpURLConnection urlConnection = (HttpURLConnection) urlObj.openConnection();
InputStream is = urlConnection.getInputStream();

Passaggio 2 bis

int status = response.getStatusLine().getStatusCode();

diventa:

int status = urlConnection.getResponseCode();

Ehi @Benjamin, come inviare l'URL con il metodo PUT?
Dharma Sai Seerapu,

@TrickySolutions Spiacenti, non ho ancora usato il metodo PUT.
Benjamin Piette,

521

se stai usando target sdk come 23 aggiungi il codice qui sotto nel tuo build.gradle

android{
    compileSdkVersion 23
    buildToolsVersion '23.0.1'
    useLibrary  'org.apache.http.legacy'
}

e cambia il tuo buildscript in

classpath 'com.android.tools.build:gradle:1.3.0' 

per maggiori informazioni segui questo link


7
cambia il tuo buildscript in classpath 'com.android.tools.build:gradle:1.3.0'
Jinu,

3
Avevo già 1.3.1. Non riesco ancora a risolvere le lezioni all'interno di Android Studio:Error:(14, 23) error: package org.apache.http does not exist
Henrique de Sousa,

2
android studio 1.4 beta 2
Jinu

2
E se si desidera utilizzare l'ultima versione dei componenti http di Apache?
Russellhoff,

2
Grazie, è necessario aggiornare Android Studio dalla versione 1.3 alla precedente. Ha funzionato
mithil1501

94

Ho riscontrato questo problema e ho trovato queste pagine: qui puoi vedere che la libreria apache è obsoleta, ma non è stata rimossa, quindi dovrebbe funzionare. Non

Vedere .

E qui puoi vedere come includere la libreria apache nel tuo progetto

Vedere .

Ho risolto il problema aggiungendo quanto segue al mio file build.gradle come raccomandato nel secondo collegamento.

android {
    useLibrary 'org.apache.http.legacy'
}

Tuttavia, questo funziona solo se stai usando il grado 1.3.0-beta2 o superiore, quindi dovrai aggiungerlo alle dipendenze buildscript se sei su una versione precedente:

classpath 'com.android.tools.build:gradle:1.3.0-beta2'

Spero che questo ti aiuti.


Per me non è riuscito con: Errore: Esecuzione non riuscita per l'attività ': xenoAmp: mergeDebugJavaResources'. > Impossibile determinare la cartella di espansione per L: \ Projekty \ xenoampgit \ xenoAmp \ build \ intermediates \ packagedJarsJavaResources \ debug \ httpclient-android-4.3.5.1.jar1037172435 \ META-INF \ LICENSE con cartelle L: \ Projekty \ xenoampgit \ xenoAmp \ build \ intermediates \ sourceFolderJavaResources \ debug, L: \ Projekty \ xenoampgit \ xenoAmp \ build \ intermediates \ packagedJarsJavaResources \ debug
ssuukk

@ssuukk Ciao, hai trovato una soluzione per questo errore?
CeccoCQ,

2
Sfortunatamente la soluzione è stata quella di cambiare target all'attuale API più alta, e questo ha rotto MOLTE cose! Quindi ho dovuto aggiungere "useLibrary", "classpath" PLUS riferimento lib legacy apache, come descritto altrove in questa domanda. E dopo che è stato compilato di nuovo, ho appena deciso di abbandonare del tutto il codice Apache e di sostituirlo con URLConnection, il che è stato più facile di quanto pensassi.
ssuukk,

D'accordo con ssuukk. Nessuna di queste risposte ha funzionato per me, così ho finito per sbarazzarmi anche delle librerie Apache. Sono abbastanza nuovo nello sviluppo di Android ma è stato semplice.
John81,

Ho avuto lo stesso problema e ho risolto con useLibrary 'org.apache.http.legacy' come ha detto Milos ... tuttavia per @ssuukk con il tuo problema puoi provare ad aggiungere sempre questo: android {packagingOptions {exclude 'META-INF / LICENSE 'escludi' META-INF / DEPENDENCIES 'escludi' META-INF / NOTICE 'escludi' META-INF / NOTICE.txt 'escludi' META-INF / MANIFEST '}}
Alexiscanny,

53

Aggiungi questa libreria in build.gradle

 android {
      useLibrary 'org.apache.http.legacy'
 }

qualcuno può spiegarlo? Perché questo lo fa funzionare? Perché è necessario aggiungere questa riga, oltre all'aggiunta delle dipendenze?
Dan,

2
@Dan è perché la libreria org.apache.http è stata rimossa con la versione 23.
eltiare

Per chiarire, questo non va nella radice build.gradle, ma piuttosto nella cartella del modulo che stai costruendo (ad es. "App")
hamx0r

37

copia org.apache.http.legacy.jarche si trova nella Android/Sdk/platforms/android-23/optionalcartella inapp/libs

e ha anche aggiunto questa riga al file app.gradle

compile files('libs/org.apache.http.legacy.jar')

Ma se stai usando più librerie jar, puoi usarlo in questo modo

compile fileTree(dir: 'libs', include: ['*.jar'])

2
In un altro dei miei progetti questa si è rivelata l'unica risposta che ha funzionato così +1 e grazie.
Apqu,

perché questa non è la risposta?
Dibble,

1
Stessa cosa per me. Qualcuno dovrebbe accettare questa risposta invece quella accettata ora.
Ivan Fazaniuk,

Questo è il minimo percorso di resistenza, non sono sicuro di voler scendere di livello. Compilare bene per me.
Ed Manners,

Grazie! Funziona con il plugin gradle-sperimentale 0.6.0-alpha5. "useLibrary" non sembra esistere nel plugin sperimentale.
monkey0506,

14

Fondamentalmente tutto ciò che devi fare è aggiungere:

useLibrary  'org.apache.http.legacy'

Al tuo build.gradlefile.


9

Ho riscontrato lo stesso problema. La risposta di Daniel Nugent ha aiutato un po '(dopo aver seguito il suo consiglio è HttpResponsestato trovato - ma ilHttpClient mancava ancora).

Quindi ecco cosa l'ha risolto per me:

  1. (se non lo hai già fatto, elogia le precedenti dichiarazioni di importazione)
  2. visita http://hc.apache.org/downloads.cgi
  3. prendi il 4.5.1.zipdalla sezione binaria
  4. decomprimerlo e incollare httpcore-4.4.3& httpclient-4.5.1.jaraproject/libs cartella
  5. fai clic con il pulsante destro del mouse sul barattolo e scegli Aggiungi come libreria .

Spero che sia d'aiuto.


9

Ho riscontrato problemi simili, potresti riuscire a farlo funzionare con un metodo simile.

Innanzitutto, prova questo con la tua configurazione attuale, escludi httpclientda httpmime:

dependencies {
    compile 'com.google.android.gms:play-services:+'
    compile ('org.apache.httpcomponents:httpmime:4.2.6'){
            exclude module: 'httpclient'
        }
    compile 'org.apache.httpcomponents:httpclient:4.2.6'
} 

Nel mio caso, l'ho risolto usando i seguenti vasetti:

Quindi, in build.gradle, escluso httpclientda httpmime:

dependencies {
    compile 'com.google.android.gms:play-services:+'
    compile('org.apache.httpcomponents:httpmime:4.3.5') {
        exclude module: 'httpclient'
    }
    compile 'org.apache.httpcomponents:httpclient-android:4.3.5.1'
}

Grazie per la tua risposta, temo che non abbia funzionato per me :(
Apqu

@tur è strano, la seconda opzione ha funzionato per me. Assicurati che i tuoi vecchi file jar vengano eliminati per la seconda opzione.
Daniel Nugent,

A cosa serve libs/core.jar?
IgorGanapolsky,

7

Risposta perfetta di Jinu e Daniel

Aggiungendo a questo ho risolto il problema utilizzando questo, se compileSdkVersion è 19 (NEL MIO CASO)

compile ('org.apache.httpcomponents:httpmime:4.3'){
    exclude group: 'org.apache.httpcomponents', module: 'httpclient'
}
compile ('org.apache.httpcomponents:httpcore:4.4.1'){
    exclude group: 'org.apache.httpcomponents', module: 'httpclient'
}
compile 'commons-io:commons-io:1.3.2'

altrimenti se compileSdkVersion è 23, utilizzare

android {
useLibrary 'org.apache.http.legacy'
packagingOptions {
    exclude 'META-INF/DEPENDENCIES'
    exclude 'META-INF/NOTICE'
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/LICENSE.txt'
    exclude 'META-INF/NOTICE.txt'
    }
}

5

Questo è quello che ho fatto e funziona per me.

passaggio 1: aggiungilo in build.grade (modulo: app)

compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'

passaggio 2: sincronizzare il progetto ed eseguire.


Qual è il motivo del voto negativo?
NOT_A_PROGRAMMER

impossibile risolvere con errore "Impossibile risolvere: org.jbundle.util.osgi.wrapped: org.jbundle.util.osgi.wrapped.org.apache.http.cli‌ ‌ ent: 4.1.2". Sto usando il grado sperimentale 0.6.0-beta. Riesci a capirlo ?
RoFF

1

La versione del client HTTP Apache fornita su Android era molto vecchia .

Google Android 1.0 è stato rilasciato con un'istantanea pre-BETA di Apache HttpClient. In coincidenza con la prima versione di Android, le API di Apache HttpClient 4.0 dovevano essere congelate prematuramente, mentre molte interfacce e strutture interne non erano ancora completamente elaborate. Mentre Apache HttpClient 4.0 stava maturando, il progetto si aspettava che Google incorporasse gli ultimi miglioramenti del codice nella sua struttura di codice. Purtroppo non è successo.

Mentre si potrebbe continuare ad usare la vecchia biblioteca deprecato tramite la useLibrary 'org.apache.http.legacy'soluzione (suggerito da @Jinu e altri), si ha realmente bisogno di stringere i denti e l'aggiornamento a qualcos'altro, ad esempio, il nativo di Android HttpUrlConnection, o se questo non soddisfa le vostre esigenze, è possibile utilizzare la libreria OkHttp , che è quello che HttpUrlConnectionsi basa internamente su ogni caso.

OkHttp ha in realtà un livello di compatibilità che utilizza la stessa API del client Apache, sebbene non implementino tutte le stesse funzionalità, quindi il tuo chilometraggio può variare.

Mentre è possibile importare una versione più recente del client Apache (come suggerito da @MartinPfeffer), è probabile che la maggior parte delle classi e dei metodi che stavi utilizzando prima siano stati deprecati, e c'è un rischio piuttosto grande che l'aggiornamento introduca bug nel tuo codice (ad esempio ho trovato alcune connessioni che in precedenza funzionavano da dietro un proxy non funzionava più), quindi questa non è un'ottima soluzione.


1

Dopo aver trascorso giorni sull'argomento, sono finalmente riuscito a risolverlo. Purtroppo ne abbiamo bisogno se vogliamo usare i file di espansione. La soluzione è stata fornita da alcune persone qui, ma per me mancavano alcuni dettagli minori che mi avrebbero risparmiato molto tempo. Ecco la sequenza di eventi per principianti come me per risparmiare tempo prezioso.

Per prima cosa ho importato la cartella "libreria" da D: \ Users \ Imre \ AppData \ Local \ Android \ sdk1 \ extras \ google \ play_licensing nel progetto andando in File, Nuovo, Modulo di importazione e navigando nella cartella "libreria". Se apri Gestione SDK e fai clic su "Avvia Gestione SDK standalone" nella parte inferiore della schermata popup, puoi passare il puntatore sulla cartella "Extra" in basso e le piccole informazioni gialle ti diranno dove troverai il pacchetto che è necessario importare.

Fatto ciò, vai alla sezione "libreria" nel riquadro sinistro con "Progetto" e al suo interno si apre la scheda "Android". Apri la sezione java della libreria e apri la classe APKExpansionPolicy. Se hai errori e import org.apache.http.NameValuePair e import org.apache.http.client.utils.URLEncodedUtils sono di colore grigio chiaro, apri build.gradle (Progetto: qualunque) e assicurati che in "buildscript" sotto "dependance" hai incluso "classpath" com.android.tools.build:gradle:1.5.0 ". 1.5.0 potrebbe essere diverso nel tuo caso. Immagino che dipenda dalla tua versione di Studio. Il mio è 1.5.1. Se il tuo è più recente, ti verrà ricordato di aggiornare i numeri.

Successivamente, vai su "build.gradle (Modulo: libreria) e includi" useLibrary 'org.apache.http.legacy' nella sezione "android". Sync Now (R / H top corner) dovrebbe essere offerto. Fallo.

Se ricevi altri messaggi di errore (non lo saprei perché l'ho fatto il contrario), i file Apache potrebbero mancare dal tuo progetto, poiché apache non è più supportato. Trovali in C / D: Users / Nome / AppData / Local / Android / Sdk / platform / android-23 / opzionale e copia / incolla nella cartella project / app / libs. Dovresti avere un file optional.json e un org.apache.http.legacy.jar lì dentro. Potresti andare meglio sul sito Web di Apache e scaricare la versione più recente: http://hc.apache.org/downloads.cgi Decomprimilo dove vuoi, aprilo, vai su "lib", copia il httpclient-4.5.1 .jar e sostituisci il file org.apache.http.legacy.jar con esso.

Sincronizza e ricostruisci / ripulisci il tuo progetto e dovrebbe andare bene.

Per ogni evenienza, apri il tuo terminale (L / H in basso di Android Studio) e digita "gradlew clean". Installerà alcune cose. Una volta fatto, digita "gradlew assemble". Ci vorranno alcuni minuti per terminare, ma ti darà gli errori se ne hai, ovviamente. Se non riesci a digitare nulla nel Terminale, avvia il prompt dei comandi (pulsante Windows + R), digita cmd, premi OK, fai clic con il pulsante destro del mouse sul titolo della piccola schermata popup nera (C: \ WINDOWS \ system32 \ cmd.exe) , Proprietà, Opzioni, nella parte inferiore della finestra verifica che "Usa console legacy" sia ispessito. Riavvia A.Studio.

In bocca al lupo!


1

Ho dovuto pubblicare come nessuna delle risposte sopra ha funzionato completamente per me.

Sto usando Android Studio

classpath 'com.android.tools.build:gradle:1.5.0'

compileSdkVersion 23
buildToolsVersion "23.0.3"

Passaggio 1: scarica l'ultimo file jar ( http://www-eu.apache.org/dist//httpcomponents/httpclient/binary/httpcomponents-client-4.5.2-bin.zip )

Passo 2: Copia incolla il file .jar nella cartella libs (crea se non esiste già) nel tuo modulo (può essere app o libreria)

Passaggio 3: fare clic destro sul vaso e "Aggiungi come libreria". Aggiungerà automaticamente il file jar come dipendenza nel file gradle del modulo

Passaggio 4: ora il problema verrà risolto automaticamente, ma nel caso in cui si utilizzi proguard nella propria app, verrà visualizzato un avviso relativo ai file di classe duplicati e non sarà possibile crearlo. È un bug noto e devi aggiungere le seguenti regole proguard

-dontwarn org.apache.commons.**
-keep class org.apache.http.** { *; }
-dontwarn org.apache.http.**

In bocca al lupo!


0

Nel mio caso, ho aggiornato una delle mie librerie nel mio progetto Android.

Sto usando Reservoir come soluzione di archiviazione cache: https://github.com/anupcowkur/Reservoir

Sono passato da:

compile 'com.anupcowkur:reservoir:2.1'

Per:

compile 'com.anupcowkur:reservoir:3.1.0'

L'autore della libreria deve aver rimosso la libreria commons-io dal repository in modo che la mia app non funzionasse più.

Ho dovuto includere manualmente il commons-io aggiungendo questo su Gradle:

compile 'commons-io:commons-io:2.5'

https://mvnrepository.com/artifact/commons-io/commons-io/2.5


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.