web-dev-qa-db-fra.com

Comment importer correctement HttpClient depuis org.Apache sur Android en utilisant un fichier de construction gradle?

Je vois cette erreur lorsque j'essaie d'exécuter "build gradle"

WARNING: Dependency org.Apache.httpcomponents:httpclient:4.2.3 is ignored for the default configuration as it may be conflicting with the internal version provided by Android.
         In case of problem, please repackage with jarjar to change the class packages
:prepareFreeDebugDependencies
:compileFreeDebugAidl UP-TO-DATE
:generateFreeDebugBuildConfig UP-TO-DATE
:mergeFreeDebugAssets UP-TO-DATE
:compileFreeDebugRenderscript UP-TO-DATE
:mergeFreeDebugResources UP-TO-DATE
:processFreeDebugManifest UP-TO-DATE
:processFreeDebugResources UP-TO-DATE
:compileFreeDebug
/home/xrdawson/Projects/Foo/Bar/src/main/Java/com/Foo/app/PixActivity.Java:20: error: package org.Apache.http.entity.mime does not exist
import org.Apache.http.entity.mime.HttpMultipartMode;
                              ^

La fin de mon build.gradle ressemble à ceci:

    repositories {
        mavenCentral()
    }

    dependencies { 
        compile fileTree(dir: 'libs', include: '*.jar')
        compile "org.Eclipse.mylyn.github:org.Eclipse.egit.github.core:2.1.3"
        compile "com.madgag:markdownj-core:0.4.1"
//      compile "org.Apache.httpcomponents:com.springsource.org.Apache.httpcomponents.httpclient:4.2.1"
        compile 'org.Apache.httpcomponents:httpclient:4.2.3'
        compile "com.google.Android:support-v4:r6"
    } 
}

Pourquoi le processus de compilation ignore-t-il HttpClient, mais échoue-t-il ensuite à la compilation?

38
xrd

Je pense que la bibliothèque httpclient n'inclut pas les parties mime, celles-ci sont en httpmime. Il s'agit d'une dépendance transitive de httpclient, mais comme elle est ignorée, elle ne sera pas prise en compte.

Essayez d'ajouter cette dépendance:

compile "org.Apache.httpcomponents:httpmime:4.2.3"
79
Hiery Nomus

Ajouter http-mime en tant que dépendance fait que httpclient est inclus en tant que dépendance transitive, ce qui, pour moi, a généré les mêmes avertissements que l'OP. J'ai dû dire à gradle d'ignorer la dépendance transitive:

compile ('org.Apache.httpcomponents:httpmime:4.3.5') {
    // avoid "is ignored for the default configuration X" warnings 
    // since httpclient is included in the Android SDK.
    exclude group: 'org.Apache.httpcomponents', module: 'httpclient'
}
17
twelve17

Pour Android, il existe désormais une distribution Maven reconditionnée HttpClient 4.3.X

Dépôt de projet: https://github.com/smarek/httpclient-Android
Balise Maven: cz.msebera.Android:httpclient:4.3.+
Publié dans le référentiel Maven Central

Qui dans la version 4.3.3 inclut HttpCore, HttpClient, HttpClient-Cache et HttpMime (tous de la même version)

Avertissement: je suis l'auteur dudit projet

13
Marek Sebera

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'
    }
}
3
Sophia

Parce que les API officielles Android Android incluent httpclient, nous supprimons toutes les dépendances sur httpclient, y compris sa dépendance transitive.

si vous voulez vraiment utiliser httpclient, je le reconditionnerais avec jarjar, renommer les packages et l'utiliser à la place.

Quant à httpmime, il semble que ce ne soit pas réellement dans Android.jar, nous pourrions donc éviter de le filtrer, mais pour l'instant, vous devrez l'ajouter manuellement.

Nous voudrons probablement peaufiner cela avant que le système de construction passe à 1.0

2
Xavier Ducrohet

Ajoutez simplement ceci au fichier build.gradle (Module: app):

dependencies {
...
   implementation "org.Apache.httpcomponents:httpmime:4.5.6"
}
0
Gabriel