Apache Fluent ClientのHttpClientへの推移的な依存関係により、NoClassDefFoundExceptionsが発生します

Jeroen Vannevel

私は次のgradleファイルを持っています:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    packagingOptions {
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/DEPENDENCIES'
    }

    defaultConfig {
        applicationId "com.guesstheurf.guesstheurf"
        minSdkVersion 15
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'
    compile (
            [group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.5.0'],
            [group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.5.0'],
            [group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.5.0']
    )

    compile ('org.apache.httpcomponents:fluent-hc:4.4.1')
}

これを作成すると、次のような警告が表示されます

依存関係org.apache.httpcomponents:httpclient:4.4.1は、Androidが提供する内部バージョンと競合する可能があるため、リリースでは無視されます。

これは、によって依存される依存関係httpcomponents:fluent-hcです。

このソースは、競合の原因となる推移的な依存関係を除外できることを示す依存関係管理(51.4.7章:推移的な依存関係の除外)見つかりました

しかし、私がそれを変更すると

compile ('org.apache.httpcomponents:fluent-hc:4.4.1') { exclude module: 'httpclient' }

Gradleの警告は実際に消えましたが、問題は解決していません。

原因:java.lang.NoClassDefFoundError:org.apache.http.client.fluent.InternalEntityEnclosingHttpRequest at org.apache.http.client.fluent.Request.Post(Request.java:95)

使用しても問題は解決しません

exclude group: 'org.apache.httpcomponents', module: 'httpclient'

この回答に示されているように

使うとき

configurations {
    all*.exclude module: 'httpclient'
}

ランタイムエラーは解決しませんが、警告も表示されなくなります。

を使用force = trueて自分のバージョンを強制することを提案するこのソース、問題を修正ません。

ここで提案されているようにhttpclient関連の依存関係を明示的に追加することも機能しません(そして警告を削除しません):

compile 'org.apache.httpcomponents:httpclient:4.4.1'
compile 'org.apache.httpcomponents:fluent-hc:4.4.1'
compile "org.apache.httpcomponents:httpmime:4.4.1"
compile 'org.apache.httpcomponents:httpcore:4.4.1'

どうすればfluent-hcを機能させることができますか?また、51.2.3バージョンの競合を解決するためのデフォルトの解決戦略であるため、httpclientパッケージの最新バージョンを単に選択しないのはなぜですか?

ok2c

そして、それがデフォルトの解決戦略であるため、httpclientパッケージの最新バージョンを単に選択しないのはなぜですか?

Androidには非常に古い(BETA1より前の)バージョンのHttpClient 4.0が付属しているため、ストックHttpClientのどのバージョンも使用できません。Gradleプラグインは明らかに、非互換性と競合の可能性について警告するのに十分スマートです。

ここには2つのオプションがあります。

  1. HttpClientの公式Androidポートを使用します。これは、デフォルトでAndroidに付属しているバージョンとAPI互換です。

    dependencies {
        compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1'
        compile group: 'org.apache.httpcomponents' , name: 'fluent-hc' , version: '4.3.5'
    }
    
  2. Dirk Boyeによって開発されたスクリプトを使用して、HttpClientを別の名前空間に再パッケージ化しますHttpClientの最新リリースでのマイレージは異なる場合があります。

    org.apache.http -> thank.you.google.org.apache.http
    

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ