Android Gradle Apache HttpClient existiert nicht?

263

Ich versuche, ein IntelliJ-Projekt in das Gradle-System von Android Studio zu konvertieren, aber es treten Fehler mit Apache HttpClient auf. Vermisse ich etwas, die Fehler, die ich bekomme, sind wie folgt:

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

Meine build.gradle-Datei weist die folgenden Abhängigkeiten auf:

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')
}

Es scheint, dass viele Leute ein ähnliches Problem haben, aber weder SO noch Google haben eine Lösung. Ich hoffe, dass diese Frage zukünftigen Suchenden helfen wird.

Apqu
quelle

Antworten:

39

Ich schlage vor, Sie ersetzen den veralteten Apache HttpClient durch die neue HttpURLConnection.

Das ist eine sauberere Lösung, die Migration ist recht einfach und im Allgemeinen ist es besser, sich an die neuesten SDK-Änderungen zu halten, als zu versuchen, zu hacken / zu patchen / zu umgehen: Sie bereuen es normalerweise später :)

Schritt 1

HttpGet httpGet = new HttpGet(url);

wird:

URL urlObj = new URL(url);

Schritt 2

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

wird:

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

Schritt 2 bis

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

wird:

int status = urlConnection.getResponseCode();
Benjamin Piette
quelle
Hey @Benjamin, wie sende ich eine URL mit der PUT-Methode?
Dharma Sai Seerapu
@TrickySolutions Sorry, keine Ahnung, habe die PUT-Methode noch nicht verwendet.
Benjamin Piette
521

Wenn Sie das Ziel-SDK als 23 verwenden, fügen Sie den folgenden Code in Ihr build.gradle ein

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

und ändern Sie Ihr Buildscript in

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

Für weitere Informationen folgen Sie diesem Link

Jinu
quelle
7
Ändern Sie Ihr Buildscript in den Klassenpfad 'com.android.tools.build:gradle:1.3.0'
Jinu
3
Hatte schon 1.3.1. Klassen in Android Studio können immer noch nicht aufgelöst werden:Error:(14, 23) error: package org.apache.http does not exist
Henrique de Sousa
2
Android Studio 1.4 Beta 2
Jinu
2
Und was ist, wenn Sie die neueste Version der Apache http-Komponenten verwenden möchten?
Russellhoff
2
Vielen Dank, Jinu, ein Update von Android Studio von 1.3 auf die obige Version ist ein Muss.
Habe
94

Ich hatte dieses Problem und fand dann diese Seiten: Hier können Sie sehen, dass die Apache-Bibliothek veraltet ist, aber nicht entfernt wurde, also sollte es funktionieren. Das tut es nicht.

Siehe .

Und hier können Sie sehen, wie Sie die Apache-Bibliothek in Ihr Projekt aufnehmen

Siehe .

Ich habe das Problem behoben, indem ich meiner build.gradle-Datei Folgendes hinzugefügt habe, wie im zweiten Link empfohlen.

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

Dies funktioniert jedoch nur, wenn Sie Gradle 1.3.0-beta2 oder höher verwenden. Sie müssen dies also zu Buildscript-Abhängigkeiten hinzufügen, wenn Sie eine niedrigere Version verwenden:

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

Hoffe das hilft.

Milos Savanovic
quelle
Für mich schlug es fehl mit: Fehler: Ausführung für Aufgabe ': xenoAmp: mergeDebugJavaResources' fehlgeschlagen. > Der Erweiterungsordner für L: \ Projekty \ xenoampgit \ xenoAmp \ build \ intermediates \ packagedJarsJavaResources \ debug \ httpclient-android-4.3.5.1.jar1037172435 \ META-INF \ LICENSE mit den Ordnern L: \ Projekty \ xenoampgit \ xenoAmp kann nicht ermittelt werden \ intermediates \ sourceFolderJavaResources \ debug, L: \ Projekty \ xenoampgit \ xenoAmp \ build \ intermediates \ packagedJarsJavaResources \ debug
ssuukk
@ssuukk Hallo, hast du eine Lösung für diesen Fehler gefunden?
CeccoCQ
2
Leider bestand die Lösung darin, das Ziel auf die aktuell höchste API zu ändern, und das hat eine Menge Dinge kaputt gemacht! Dann musste ich "useLibrary", "classpath" PLUS Referenz Legacy Apache Lib hinzufügen, wie an anderer Stelle in dieser Frage beschrieben. Und nachdem es wieder kompilierbar war, habe ich mich entschlossen, Apache-Code komplett wegzulassen und alles durch URLConnection zu ersetzen, was einfacher war als ich dachte.
ssuukk
Stimmen Sie mit ssuukk überein. Keine dieser Antworten funktionierte für mich, so dass ich auch die Apache-Bibliotheken loswurde. Ich bin ziemlich neu in der Android-Entwicklung, aber es war unkompliziert.
John81
Ich hatte das gleiche Problem und habe mit useLibrary 'org.apache.http.legacy' behoben, wie Milos sagte ... Für @ssuukk mit Ihrem Problem können Sie jedoch versuchen, dies immer hinzuzufügen: android {packageOptions {exclude 'META-INF / LICENSE 'META-INF / ABHÄNGIGKEITEN ausschließen' 'META-INF / HINWEIS ausschließen' 'META-INF / NOTICE.txt ausschließen' 'META-INF / MANIFEST ausschließen'}}
Alexiscanny
53

Fügen Sie diese Bibliothek hinzu build.gradle

 android {
      useLibrary 'org.apache.http.legacy'
 }
Darshan Dhoriya
quelle
kann das jemand erklären Warum funktioniert das so? Warum müssen wir diese Zeile hinzufügen, abgesehen von den Abhängigkeiten?
Dan
2
@ Dan ist, weil die Bibliothek org.apache.http mit Version 23 entfernt wurde.
eltiare
Zur Verdeutlichung geht dies nicht in das Stammverzeichnis build.gradle, sondern in den
Modulordner, den Sie erstellen
37

Kopie, org.apache.http.legacy.jardie sich im Android/Sdk/platforms/android-23/optionalOrdner befindet, nachapp/libs

und fügte diese Zeile auch der Datei app.gradle hinzu

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

Wenn Sie jedoch mehr JAR-Bibliotheken verwenden, können Sie diese verwenden

compile fileTree(dir: 'libs', include: ['*.jar'])
do01
quelle
2
In einem anderen meiner Projekte erwies sich dies als die einzige Antwort, die so +1 und danke funktionierte.
Apqu
Warum ist das nicht die Antwort?
Dibble
1
Auch für mich. Jemand sollte diese Antwort akzeptieren, anstatt die jetzt akzeptierte.
Ivan Fazaniuk
Dies ist der geringste Weg des Widerstands, ich bin mir nicht sicher, ob ich Gradle herabstufen möchte. Es kompiliert gut für mich.
Ed Manners
Vielen Dank! Dies funktioniert mit dem gradle-experimentellen 0.6.0-alpha5-Plugin. "useLibrary" scheint im experimentellen Plugin nicht zu existieren.
monkey0506
14

Grundsätzlich müssen Sie nur Folgendes hinzufügen:

useLibrary  'org.apache.http.legacy'

Zu Ihrer build.gradleDatei.

ATechPerson
quelle
9

Ich bin auf das gleiche Problem gestoßen. Daniel Nugents Antwort half ein wenig (nachdem er seinen Rat befolgt hatte, HttpResponsewurde er gefunden - aber der HttpClientfehlte noch).

Also hier ist, was es für mich behoben hat:

  1. (falls noch nicht geschehen, loben Sie frühere Import-Anweisungen heraus)
  2. Besuchen Sie http://hc.apache.org/downloads.cgi
  3. Holen Sie sich die 4.5.1.zipaus dem binären Abschnitt
  4. entpacke es und füge httpcore-4.4.3& httpclient-4.5.1.jarin project/libsOrdner ein
  5. Klicken Sie mit der rechten Maustaste auf das Glas und wählen Sie Als Bibliothek hinzufügen .

Ich hoffe es hilft.

Martin Pfeffer
quelle
9

Ich bin auf ähnliche Probleme gestoßen. Möglicherweise können Sie es mit einer ähnlichen Methode zum Laufen bringen.

Versuchen Sie dies zunächst mit Ihrer aktuellen Konfiguration und schließen Sie Folgendes httpclientaus 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'
} 

In meinem Fall habe ich das Problem mithilfe der folgenden Gläser behoben:

Dann in der build.gradle, ausgenommen httpclientvon 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'
}
Daniel Nugent
quelle
Vielen Dank für Ihre Antwort, ich fürchte, keiner hat für mich funktioniert :(
Apqu
@tur das ist seltsam, die zweite Option hat bei mir funktioniert. Stellen Sie sicher, dass Ihre alten JAR-Dateien für die zweite Option gelöscht werden.
Daniel Nugent
Wofür ist libs/core.jar?
IgorGanapolsky
7

Perfekte Antwort von Jinu und Daniel

Außerdem habe ich das Problem mithilfe von This gelöst, wenn Ihre compileSdkVersion 19 ist (IN MEINEM FALL).

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'

Andernfalls verwenden Sie, wenn Ihre compileSdkVersion 23 ist

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'
    }
}
Sophia
quelle
5

Das habe ich getan und es funktioniert für mich.

Schritt 1: Fügen Sie dies in die build.grade ein (Modul: App)

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

Schritt 2: Synchronisieren Sie das Projekt und fertig.

NOT_A_PROGRAMMER
quelle
Gibt es einen Grund für eine Ablehnung?
NOT_A_PROGRAMMER
Es konnte nicht mit dem Fehler "Fehler beim Auflösen: org.jbundle.util.osgi.wrapped: org.jbundle.util.osgi.wrapped.org.apache.http.cli‌ ‌ ent: 4.1.2" behoben werden. Ich benutze experimentelle Gradle 0.6.0-Beta. Kannst du es herausfinden?
RoFF
1

Die Version des Apache HTTP-Clients, die auf Android verfügbar ist, war sehr, sehr alt .

Google Android 1.0 wurde mit einem Pre-BETA-Snapshot von Apache HttpClient veröffentlicht. Zur Zeit der ersten Android-Version mussten Apache HttpClient 4.0-APIs vorzeitig eingefroren werden, während viele Schnittstellen und interne Strukturen noch nicht vollständig ausgearbeitet waren. Als Apache HttpClient 4.0 ausgereift war, erwartete das Projekt, dass Google die neuesten Codeverbesserungen in seinen Codebaum aufnehmen würde. Leider ist es nicht passiert.

Während Sie könnten halten die alte veraltete Bibliothek über die Verwendung useLibrary 'org.apache.http.legacy'umgehen (vorgeschlagen von @Jinu und andere), die Sie wirklich brauchen die Kugel und aktualisieren , um etwas anderes zu beißen, zum Beispiel die native Android HttpUrlConnection, oder wenn das nicht Ihren Bedürfnissen, können Sie die Verwendung OkHttp Bibliothek , das ist , was HttpUrlConnectionwird intern auf Basis sowieso.

OkHttp verfügt tatsächlich über eine Kompatibilitätsschicht , die dieselbe API wie der Apache-Client verwendet, jedoch nicht alle Funktionen implementiert , sodass Ihre Laufleistung variieren kann.

Während es möglich ist , eine neuere Version des Apache - Client zu importieren (wie von @MartinPfeffer vorgeschlagen), ist es wahrscheinlich , dass die meisten der Klassen und Methoden , die Sie vor veraltet wurden verwendet haben, und es ist ein ziemlich großes Risiko , dass eine Aktualisierung Fehler einführen In Ihrem Code (zum Beispiel habe ich festgestellt, dass einige Verbindungen, die zuvor hinter einem Proxy funktionierten, nicht mehr funktionierten), ist dies also keine großartige Lösung.

Tim Rae
quelle
1

Nachdem ich Tage mit diesem Thema verbracht hatte, gelang es mir, es endlich zu lösen. Leider brauchen wir es, wenn wir Erweiterungsdateien verwenden wollen. Die Lösung wurde von einigen Leuten hier bereitgestellt, aber für mich fehlten den Antworten ein paar kleine Details, die mir viel Zeit hätten sparen können. Hier ist die Abfolge der Ereignisse für Anfänger wie mich, um Ihre kostbare Zeit zu sparen.

Zuerst importierte ich den Ordner "Bibliothek" aus D: \ Benutzer \ Imre \ AppData \ Local \ Android \ sdk1 \ extras \ google \ play_licensing in das Projekt, indem ich in Datei, Neu, Modul importieren ging und zum Ordner "Bibliothek" navigierte. Wenn Sie den SDK-Manager öffnen und unten im Popup-Bildschirm auf "Standalone SDK Manager starten" klicken, können Sie den Mauszeiger über den Ordner "Extras" unten bewegen. Die kleinen gelben Informationen zeigen an, wo Sie sich befinden das Paket, das Sie importieren müssen.

Sobald dies erledigt ist, gehen Sie zum Abschnitt "Bibliothek" im linken Bereich mit "Projekt" und öffnen Sie darin die Registerkarte "Android". Öffnen Sie den Java-Bereich der Bibliothek und öffnen Sie die APKExpansionPolicy-Klasse. Wenn Sie Fehler haben und der Import org.apache.http.NameValuePair und der Import org.apache.http.client.utils.URLEncodedUtils hellgrau sind, öffnen Sie das build.gradle (Projekt: was auch immer) und stellen Sie sicher, dass in "Buildscript" Unter "Abhängigkeiten" ist der "Klassenpfad" com.android.tools.build:gradle:1.5.0 "enthalten. Die 1.5.0 kann in Ihrem Fall anders sein. Ich denke, es hängt von Ihrer Studio-Version ab. Meins ist 1.5.1. Wenn Ihre neuere ist, werden Sie daran erinnert, die Nummern zu aktualisieren.

Gehen Sie danach zu "build.gradle (Modul: Bibliothek) und fügen Sie die" useLibrary "org.apache.http.legacy" in den Abschnitt "android" ein. Jetzt synchronisieren (obere Ecke R / H) sollte angeboten werden. Tu es.

Wenn Sie weitere Fehlermeldungen erhalten (ich würde es nicht wissen, weil ich es umgekehrt gemacht habe), fehlen möglicherweise die Apache-Dateien in Ihrem Projekt, da Apache nicht mehr unterstützt wird. Finden Sie sie in C / D: Benutzer / Name / AppData / Lokal / Android / Sdk / Plattformen / Android-23 / optional und kopieren Sie sie / fügen Sie sie in Ihren Ordner projekt / app / libs ein. Sie sollten eine optionale.json- und eine org.apache.http.legacy.jar-Datei haben. Sie sollten besser auf die Website von Apache gehen und die neueste Version herunterladen : http://hc.apache.org/downloads.cgi Entpacken Sie sie an einer beliebigen Stelle, öffnen Sie sie, gehen Sie zu "lib" und kopieren Sie den httpclient-4.5.1 .jar-Datei und ersetzen Sie die Datei org.apache.http.legacy.jar durch diese.

Synchronisieren und erstellen / bereinigen Sie Ihr Projekt und es sollte gut gehen.

Öffnen Sie für alle Fälle Ihr Terminal (L / H unten in Android Studio) und geben Sie "gradlew clean" ein. Es werden ein paar Dinge installiert. Sobald dies erledigt ist, geben Sie "gradlew assemble" ein. Es wird ein paar Minuten dauern, bis es fertig ist, aber es wird Ihnen die Fehler geben, wenn Sie welche haben. Wenn Sie im Terminal nichts eingeben können, starten Sie die Eingabeaufforderung (Windows-Taste + R), geben Sie cmd ein, klicken Sie auf OK und klicken Sie mit der rechten Maustaste auf den Titel des kleinen schwarzen Popup-Bildschirms (C: \ WINDOWS \ system32 \ cmd.exe). , Eigenschaften, Optionen, überprüfen Sie im unteren Bereich des Fensters, ob "Legacy-Konsole verwenden" dick ist. Starten Sie A.Studio neu.

Viel Glück!

Im mein
quelle
1

Ich musste posten, da keine der oben genannten Antworten für mich vollständig funktionierte.

Ich benutze Android Studio

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

compileSdkVersion 23
buildToolsVersion "23.0.3"

Schritt 1: Laden Sie die letzte JAR-Datei herunter ( http://www-eu.apache.org/dist//httpcomponents/httpclient/binary/httpcomponents-client-4.5.2-bin.zip ).

Schritt 2: Kopieren Sie die JAR-Datei in den libs-Ordner (erstellen, falls noch nicht vorhanden) in Ihrem Modul (kann App oder Bibliothek sein).

Schritt 3: Klicken Sie mit der rechten Maustaste auf das Glas und klicken Sie auf "Als Bibliothek hinzufügen". Die JAR-Datei wird automatisch als Abhängigkeit in die Gradle-Datei Ihres Moduls eingefügt

Schritt 4: Jetzt wird Ihr Problem automatisch behoben. Wenn Sie jedoch Proguard in Ihrer App verwenden, werden Sie vor doppelten Klassendateien gewarnt und können nicht erstellt werden. Es ist ein bekannter Fehler und Sie müssen Folgendes zu Ihren Proguard-Regeln hinzufügen

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

Viel Glück!

Mitra entwerten
quelle
0

In meinem Fall habe ich eine meiner Bibliotheken in meinem Android-Projekt aktualisiert.

Ich verwende Reservoir als Cache-Speicherlösung: https://github.com/anupcowkur/Reservoir

Ich ging von:

compile 'com.anupcowkur:reservoir:2.1'

Zu:

compile 'com.anupcowkur:reservoir:3.1.0'

Der Bibliotheksautor muss die Commons-Io-Bibliothek aus dem Repo entfernt haben, damit meine App nicht mehr funktioniert.

Ich musste das Commons-Io manuell einfügen, indem ich es zu gradle hinzufügte:

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

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

Simon
quelle