Android Gradle Apache HttpClient n'existe pas?


263

J'essaie de convertir un projet IntelliJ au système Gradle d'Android Studio mais je rencontre des erreurs avec Apache HttpClient? Suis-je en train de manquer quelque chose, les erreurs que je reçois sont les suivantes:

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

Mon fichier build.gradle a les dépendances suivantes:

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

Il semble que beaucoup de gens rencontrent un problème similaire, mais ni SO ni Google n'ont de solution, j'espère donc que cette question aidera les futurs chercheurs.

Réponses:


39

Je vous suggère de remplacer l'apache obsolète HttpClient par la nouvelle HttpURLConnection.

C'est une solution plus propre, il est assez facile de migrer, et généralement il vaut mieux s'en tenir aux dernières modifications du SDK que d'essayer de pirater / patcher / contourner: vous le regrettez généralement plus tard :)

Étape 1

HttpGet httpGet = new HttpGet(url);

devient:

URL urlObj = new URL(url);

Étape 2

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

devient:

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

Étape 2 bis

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

devient:

int status = urlConnection.getResponseCode();

Hé @Benjamin, comment envoyer une URL avec la méthode PUT?
Dharma Sai Seerapu du

@TrickySolutions Désolé, aucune idée, je n'ai pas encore utilisé la méthode PUT.
Benjamin Piette

521

si vous utilisez sdk cible comme 23 ajoutez le code ci-dessous dans votre build.gradle

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

et changez votre buildscript en

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

pour plus d'informations suivez ce lien


7
changez votre buildscript en classpath 'com.android.tools.build:gradle:1.3.0'
Jinu

3
Déjà eu 1.3.1. Impossible de résoudre les cours dans 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
Et si vous souhaitez utiliser la dernière version des composants http apache?
russellhoff

2
Thanx Jinu, la mise à jour d'Android Studio de 1.3 à la version ci-dessus est indispensable.
Je l'ai

94

J'ai eu ce problème et j'ai trouvé ces pages: Ici, vous pouvez voir que la bibliothèque Apache est obsolète, mais elle n'est pas supprimée, donc cela devrait fonctionner. Ce n'est pas le cas.

Tu vois .

Et ici, vous pouvez voir comment inclure la bibliothèque Apache à votre projet

Tu vois .

J'ai résolu le problème en ajoutant le suivant à mon fichier build.gradle comme recommandé dans le deuxième lien.

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

Cependant, cela ne fonctionne que si vous utilisez gradle 1.3.0-beta2 ou supérieur, vous devrez donc l'ajouter aux dépendances de buildscript si vous utilisez une version inférieure:

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

J'espère que cela t'aides.


Pour moi, il a échoué avec: Erreur: l'exécution a échoué pour la tâche ': xenoAmp: mergeDebugJavaResources'. > Impossible de déterminer le dossier d'extension pour L: \ Projekty \ xenoampgit \ xenoAmp \ build \ intermediates \ packagedJarsJavaResources \ debug \ httpclient-android-4.3.5.1.jar1037172435 \ META-INF \ LICENSE avec les dossiers L: \ Projekty \ xenoampgit \ xenoAmp \ build \ intermediates \ sourceFolderJavaResources \ debug, L: \ Projekty \ xenoampgit \ xenoAmp \ build \ intermediates \ packagedJarsJavaResources \ debug
ssuukk

@ssuukk Salut, avez-vous trouvé une solution à cette erreur?
CeccoCQ

2
Malheureusement, la solution était de changer la cible en API la plus élevée actuelle, et cela a cassé BEAUCOUP de choses! Ensuite, j'ai dû ajouter "useLibrary", "classpath" PLUS référence apache lib héritée, comme décrit ailleurs dans cette question. Et après qu'il a été de nouveau compilable, j'ai juste décidé d'abandonner complètement le code Apache et de tout remplacer par URLConnection, ce qui était plus facile que je ne le pensais.
ssuukk

D'accord avec ssuukk. Aucune de ces réponses n'a fonctionné pour moi, j'ai donc fini par me débarrasser des bibliothèques Apache. Je suis assez nouveau dans le développement Android, mais c'était simple.
John81

J'ai eu le même problème et j'ai résolu avec useLibrary 'org.apache.http.legacy' comment Milos a dit ... cependant pour @ssuukk avec votre problème, vous pouvez essayer d'ajouter toujours ceci: android {packagingOptions {exclure 'META-INF / LICENSE 'exclure' META-INF / DEPENDANCES 'exclure' META-INF / NOTICE 'exclure' META-INF / NOTICE.txt 'exclure' META-INF / MANIFEST '}}
Alexiscanny

53

Ajoutez cette bibliothèque dans build.gradle

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

quelqu'un peut-il expliquer cela? Pourquoi est-ce que cela fonctionne? Pourquoi devons-nous ajouter cette ligne, en plus d'ajouter les dépendances?
Dan

2
@Dan c'est parce que la bibliothèque org.apache.http a été supprimée avec la version 23.
eltiare

Pour clarifier, cela ne va pas à la racine build.gradle, mais plutôt dans le dossier du module que vous construisez (c'est-à-dire "app")
hamx0r

37

copie org.apache.http.legacy.jarqui est dans le Android/Sdk/platforms/android-23/optionaldossier versapp/libs

et a également ajouté cette ligne au fichier app.gradle

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

Mais si vous utilisez plus de bibliothèques jar, vous pouvez utiliser cette méthode

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

2
Dans un autre de mes projets, cela s'est avéré être la seule réponse qui a fonctionné donc +1 et merci.
Apqu

pourquoi n'est-ce pas la réponse?
dibble

1
Pareil pour moi. Quelqu'un devrait accepter cette réponse à la place de celle acceptée maintenant.
Ivan Fazaniuk

C'est le moindre chemin de résistance, je ne suis pas sûr de vouloir déclasser le grade. Il compile bien pour moi.
Ed Manners du

Merci! Cela fonctionne avec le plugin expérimental gradle 0.6.0-alpha5. "useLibrary" ne semble pas exister dans le plugin expérimental.
monkey0506

14

Fondamentalement, tout ce que vous devez faire est d'ajouter:

useLibrary  'org.apache.http.legacy'

Dans votre build.gradledossier.


9

J'ai rencontré le même problème. La réponse de Daniel Nugent a un peu aidé (après avoir suivi ses conseils a HttpResponseété trouvé - mais le HttpClientmanquait toujours).

Voici donc ce qui l'a corrigé pour moi:

  1. (si ce n'est pas déjà fait, recommandez les déclarations d'importation précédentes)
  2. visitez http://hc.apache.org/downloads.cgi
  3. obtenir le à 4.5.1.zippartir de la section binaire
  4. décompressez - coller httpcore-4.4.3et httpclient-4.5.1.jardans le project/libsdossier
  5. faites un clic droit sur le pot et choisissez Ajouter comme bibliothèque .

J'espère que ça aide.


9

J'ai rencontré des problèmes similaires, vous pourriez peut-être le faire fonctionner en utilisant une méthode similaire.

Tout d'abord, essayez ceci avec votre configuration actuelle, excluez httpclientde 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'
} 

Dans mon cas, je l'ai corrigé en utilisant les pots suivants:

Ensuite, dans le build.gradle, à l'exclusion httpclientde 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'
}

Merci pour votre réponse, je crains que ni l'un ni l'autre
n'aient

@tur c'est étrange, la deuxième option a fonctionné pour moi. Assurez-vous que vos anciens fichiers jar sont supprimés pour la deuxième option.
Daniel Nugent

À quoi ça sert libs/core.jar?
IgorGanapolsky

7

Réponse parfaite de Jinu et Daniel

Ajoutant à cela, j'ai résolu le problème en utilisant ceci, si votre version compileSdk est 19 (DANS MON CAS)

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'

sinon si votre compileSdkVersion est 23 alors utilisez

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

C'est ce que j'ai fait et ça marche pour moi.

étape 1: ajoutez ceci dans le build.grade (module: app)

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

étape 2: synchronisez le projet et terminé.


Une raison pour voter contre?
NOT_A_PROGRAMMER

il n'a pas pu être résolu avec l'erreur "Impossible de résoudre: org.jbundle.util.osgi.wrapped: org.jbundle.util.osgi.wrapped.org.apache.http.cli‌ ‌ ent: 4.1.2". J'utilise le grade expérimental 0.6.0-beta. pouvez-vous le comprendre?
RoFF

1

La version du client HTTP Apache fournie sur le stock Android était très très ancienne .

Google Android 1.0 a été publié avec un instantané pré-BETA d'Apache HttpClient. Pour coïncider avec la première version d'Android, les API Apache HttpClient 4.0 ont dû être figées prématurément, alors que de nombreuses interfaces et structures internes n'étaient toujours pas entièrement élaborées. Alors qu'Apache HttpClient 4.0 arrivait à maturité, le projet s'attendait à ce que Google intègre les dernières améliorations de code dans son arborescence de code. Malheureusement, cela ne s'est pas produit.

Bien que vous puissiez continuer à utiliser l'ancienne bibliothèque obsolète via la useLibrary 'org.apache.http.legacy'solution de contournement (suggérée par @Jinu et d'autres), vous devez vraiment mordre la balle et passer à autre chose, par exemple Android natif HttpUrlConnection, ou si cela ne répond pas à vos besoins, vous pouvez utiliser la bibliothèque OkHttp , qui est ce qui HttpUrlConnectionest basé en interne sur de toute façon.

OkHttp a en fait une couche de compatibilité qui utilise la même API que le client Apache, bien qu'ils n'implémentent pas toutes les mêmes fonctionnalités, donc votre kilométrage peut varier.

Bien qu'il soit possible d'importer une version plus récente du client Apache (comme suggéré par @MartinPfeffer), il est probable que la plupart des classes et méthodes que vous utilisiez auparavant ont été dépréciées, et il y a un risque assez important que la mise à jour introduise des bogues dans votre code (par exemple, j'ai trouvé que certaines connexions qui fonctionnaient auparavant derrière un proxy ne fonctionnaient plus), ce n'est donc pas une excellente solution.


1

Après avoir passé des jours sur le sujet, j'ai finalement réussi à le résoudre. Malheureusement, nous en avons besoin si nous voulons utiliser des fichiers d'extension. La solution a été apportée par quelques personnes ici, mais pour moi, les réponses manquaient de quelques détails mineurs qui auraient pu me faire gagner beaucoup de temps. Voici la séquence d'événements pour les novices comme moi pour gagner votre temps précieux.

J'ai d'abord importé le dossier "bibliothèque" de D: \ Users \ Imre \ AppData \ Local \ Android \ sdk1 \ extras \ google \ play_licensing dans le projet en allant dans Fichier, Nouveau, Importer le module et en naviguant vers le dossier "bibliothèque". Si vous ouvrez le SDK Manager et cliquez sur "Launch Standalone SDK Manager" en bas de l'écran contextuel, vous pouvez passer votre pointeur sur le dossier "Extras" en bas et la petite info jaune vous indiquera où vous trouverez le package que vous devez importer.

Une fois cela fait, descendez dans la section "bibliothèque" dans le volet gauche avec "Projet" et à l'intérieur de celui-ci l'onglet "Android" ouvert. Ouvrez la section java de la bibliothèque et ouvrez la classe APKExpansionPolicy. Si vous avez des erreurs et que l'importation org.apache.http.NameValuePair et l'importation org.apache.http.client.utils.URLEncodedUtils sont gris pâle, ouvrez le build.gradle (Projet: n'importe quoi) et assurez-vous que dans "buildscript" sous "dépendances" vous avez le "classpath 'com.android.tools.build:gradle:1.5.0" inclus. Le 1.5.0 peut être différent dans votre cas. Je suppose que cela dépend de votre version Studio. Le mien est 1.5.1. Si le vôtre est plus récent, il vous sera rappelé de mettre à jour les numéros.

Après cela, allez dans "build.gradle (Module: bibliothèque) et incluez" useLibrary "org.apache.http.legacy" dans la section "android". Sync Now (coin supérieur droit / gauche) devrait être proposé. Fais le.

Si vous obtenez d'autres messages d'erreur (je ne le saurais pas parce que je l'ai fait dans l'autre sens), les fichiers Apache peuvent être manquants dans votre projet, car apache n'est plus pris en charge. Trouvez-les dans C / D: Users / Yourname / AppData / Local / Android / Sdk / plates-formes / android-23 / facultatif et copiez / collez-les dans votre dossier project / app / libs. Vous devriez avoir un fichier facultatif.json et un fichier org.apache.http.legacy.jar dedans. Vous feriez mieux d'aller sur le site Web d'Apache et de télécharger la dernière version: http://hc.apache.org/downloads.cgi Décompressez-la où vous voulez, ouvrez-la, allez dans "lib", copiez httpclient-4.5.1 .jar et remplacez le fichier org.apache.http.legacy.jar par celui-ci.

Synchronisez et reconstruisez / nettoyez votre projet et cela devrait être bon.

Au cas où, ouvrez votre terminal (bas L / H d'Android Studio) et tapez "gradlew clean". Il va installer quelques éléments. Une fois cela fait, tapez "gradlew assemble". Cela prendra quelques minutes pour terminer, mais cela vous donnera les erreurs si vous en avez bien sûr. Si vous ne pouvez rien taper dans le terminal, lancez l'invite de commande (bouton Windows + R), tapez cmd, appuyez sur OK, cliquez avec le bouton droit sur le titre du petit écran contextuel noir (C: \ WINDOWS \ system32 \ cmd.exe) , Propriétés, Options, en bas de la fenêtre, vérifiez que "Utiliser la console héritée" est épaissi. Redémarrez A.Studio.

Bonne chance!


1

J'ai dû poster car aucune des réponses ci-dessus ne fonctionnait complètement pour moi.

J'utilise Android Studio

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

compileSdkVersion 23
buildToolsVersion "23.0.3"

Étape 1: Téléchargez le dernier fichier jar ( http://www-eu.apache.org/dist//httpcomponents/httpclient/binary/httpcomponents-client-4.5.2-bin.zip )

Étape 2: Copiez collez le fichier .jar dans le dossier libs (créez s'il n'existe pas déjà) dans votre module (peut être une application ou une bibliothèque)

Étape 3: Faites un clic droit sur le pot et "Ajouter comme bibliothèque". Il ajoutera automatiquement le fichier jar en tant que dépendance dans le fichier gradle de votre module

Étape 4: Votre problème sera désormais résolu automatiquement, mais si vous utilisez proguard dans votre application, il vous avertira des fichiers de classe en double et ne vous permettra pas de créer. C'est un bogue connu et vous devez ajouter ce qui suit à vos règles de proguard

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

Bonne chance!


0

Dans mon cas, j'ai mis à jour une de mes bibliothèques dans mon projet Android.

J'utilise Reservoir comme solution de stockage de cache: https://github.com/anupcowkur/Reservoir

Je suis passé de:

compile 'com.anupcowkur:reservoir:2.1'

À:

compile 'com.anupcowkur:reservoir:3.1.0'

L'auteur de la bibliothèque doit avoir supprimé la bibliothèque commons-io du référentiel pour que mon application ne fonctionne plus.

J'ai dû inclure manuellement le commons-io en l'ajoutant à gradle:

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

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


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.