Android Gradle Apache HttpClientは存在しませんか?


263

IntelliJプロジェクトをAndroid StudioのGradleシステムに変換しようとしていますが、Apache HttpClientでエラーが発生していますか?私は何かが足りないのですか、私が得ているエラーは次のとおりです:

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

私のbuild.gradleファイルには次の依存関係があります。

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

多くの人が同様の問題を抱えているようですが、SOでもGoogleでも解決策がないので、この質問が将来の検索に役立つことを期待しています。

回答:


39

非推奨のApache HttpClientを新しいHttpURLConnectionに置き換えることをお勧めします。

これはよりクリーンなソリューションであり、移行は非常に簡単です。一般的に、ハッキング/パッチ/回避策を試みるよりも、最新のSDKの変更に固執することをお勧めします。通常は後で後悔します:)

ステップ1

HttpGet httpGet = new HttpGet(url);

になる:

URL urlObj = new URL(url);

ステップ2

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

になる:

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

ステップ2 bis

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

になる:

int status = urlConnection.getResponseCode();

@Benjaminさん、PUTメソッドでURLを送信する方法は?
Dharma Sai Seerapu 2017

@TrickySolutions申し訳ありませんが、まだPUTメソッドを使用していません。
Benjamin Piette 2017

521

23としてターゲットSDKを使用している場合は、build.gradleに以下のコードを追加します

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

ビルドスクリプトを次のように変更します

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

詳細については、このリンクをたどってください


7
「com.android.tools.build:gradle:1.3.0」クラスパスへのあなたのbuildscript変更
アン・ジヌ

3
すでに1.3.1がありました。それでも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
また、Apache httpコンポーネントの最新バージョンを使用する場合はどうでしょうか。
russellhoff

2
ありがとうJinu、Android Studioを1.3から上記のバージョンに更新する必要があります。作業それを得た
mithil1501

94

私はこの問題を抱えていて、これらのページを見つけました:ここでは、Apacheライブラリが廃止されていることがわかりますが、削除されていないため、機能するはずです。そうではありません。

を参照してください

そして、あなたはあなたのプロジェクトにApacheライブラリを含める方法を見ることができます

を参照してください

2番目のリンクで推奨されているように、build.gradleファイルに以下を追加することで問題を解決しました。

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

ただし、これはgradle 1.3.0-beta2以降を使用している場合にのみ機能するため、下位バージョンを使用している場合は、ビルドスクリプトの依存関係にこれを追加する必要があります。

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

お役に立てれば。


私にとってそれは失敗しました:Error:Execution failed for task ':xenoAmp:mergeDebugJavaResources'。> L:\ Projekty \ xenoampgit \ xenoAmp \ buildのL:\ Projekty \ xenoampgit \ xenoAmp \ build \ intermediates \ packagedJarsJavaResources \ debug \ httpclient-android-4.3.5.1.jar1037172435 \ META-INF \ LICENSEの展開フォルダーを特定できません\ intermediates \ sourceFolderJavaResources \ debug、L:\ Projekty \ xenoampgit \ xenoAmp \ build \ intermediates \ packagedJarsJavaResources \ debug
ssuukk

@ssuukkこんにちは、このエラーの解決策を見つけましたか?
CeccoCQ 2015

2
残念ながら、解決策はターゲットを現在の最高のAPIに変更することでしたが、それは多くのことを壊しました!次に、この質問の他の箇所で説明されているように、「useLibrary」、「classpath」に加えて、レガシーのapache libを追加する必要がありました。そして、それが再びコンパイル可能になった後、私はApacheコードを完全に破棄し、すべてをURLConnectionに置き換えることに決めました。これは、思ったより簡単でした。
ssuukk 2015

ssuukkに同意します。これらの答えはどれもうまくいかなかったので、Apacheライブラリも削除してしまいました。私はAndroid開発にかなり慣れていませんが、簡単でした。
John81、2015年

私は同じ問題を抱えていて、Milosが言ったようにuseLibrary 'org.apache.http.legacy'で修正しました...しかし、問題がある@ssuukkの場合は、これを常に追加してみてください:android {PackagingOptions {exclude 'META-INF / LICENSE 'exclude' META-INF / DEPENDENCIES 'exclude' META-INF / NOTICE 'exclude' META-INF / NOTICE.txt 'exclude' META-INF / MANIFEST '}}
Alexiscanny

53

このライブラリを追加 build.gradle

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

誰かがこれを説明できますか?なぜこれが機能するのですか?依存関係を追加する以外に、なぜこの行を追加する必要があるのですか?
ダン

2
org.apache.httpライブラリはバージョン23で削除されたためです@Dan
eltiare

明確にするために、これはroot build.gradleではなく、作成するモジュールフォルダー(つまり、「app」)内にあります
hamx0r

37

フォルダーにorg.apache.http.legacy.jarあるコピーAndroid/Sdk/platforms/android-23/optionalapp/libs

また、この行をapp.gradleファイルに追加しました

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

しかし、より多くのjarライブラリを使用している場合は、この方法を使用できます

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

2
私の別のプロジェクトでは、これが+1と感謝の意を表す唯一の回答であることが判明しました。
Apqu 2015年

なぜこれが答えではないのですか?
2015

1
わたしも。誰かがこの答えを受け入れる必要があります。代わりに、今は受け入れられます。
Ivan Fazaniuk 2016年

これは最も抵抗の少ない経路です。Gradleをダウングレードする必要があるかどうかはわかりません。それは私のためにうまくコンパイルされます。
Ed Manners

ありがとう!これはgradle-experimental 0.6.0-alpha5プラグインで動作します。「useLibrary」は実験的なプラグインには存在しないようです。
monkey0506 2016

14

基本的にあなたがする必要があるのは追加することです:

useLibrary  'org.apache.http.legacy'

あなたのbuild.gradleファイルに。


9

同じ問題に遭遇しました。ダニエル・ニュージェントの答えは少し助けになりました(彼のアドバイスHttpResponseに従っていたところ、見つかったのですHttpClientが、それでも見つかりませんでした)。

だからここに私のためにそれを修正したものがあります:

  1. (まだ完了していない場合は、以前のインポートステートメントを賞賛してください)
  2. http://hc.apache.org/downloads.cgiにアクセスします
  3. 4.5.1.zipバイナリセクションから取得します
  4. それを解凍して貼り付けhttpcore-4.4.3httpclient-4.5.1.jarproject/libsフォルダ
  5. jarを右クリックし、[ ライブラリとして追加 ]を選択します

それが役に立てば幸い。


9

私は同様の問題に遭遇しました、あなたは同様の方法を使用してそれを機能させることができるかもしれません。

まず、現在の構成でこれを試してください、以下httpclientから除外してください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'
} 

私の場合、次のjarを使用して修正しました。

次に、build.gradleで、以下httpclientから除外し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'
}

回答ありがとうございます。
残念

@turは奇妙ですが、2番目のオプションがうまくいきました。2番目のオプションでは、古いjarファイルが削除されていることを確認してください。
Daniel Nugent

何のlibs/core.jarため?
IgorGanapolsky 2015年

7

ジヌとダニエルの完璧な答え

これに追加して、compileSdkVersionが19の場合(これは私のケースです)、これを使用して問題を解決しました

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'

それ以外の場合、compileSdkVersionが23の場合は、

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

これは私がやったことであり、私にとってはうまくいきます。

ステップ1:これをbuild.grade(module:app)に追加します

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

ステップ2:プロジェクトを同期して完了します。


反対票を投じる理由はありますか?
NOT_A_PROGRAMMER 2015

エラー「解決できませんでした:org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.cli‌ ‌ ent:4.1.2」で解決できませんでした。私は実験的なgradle 0.6.0-betaを使用しています。分かりますか?
RoFF

1

ストックAndroidで提供されているApache HTTPクライアントのバージョンは非常に古いものでした。

Google Android 1.0がリリースされ、Apache HttpClientのベータ版より前のスナップショットが提供されました。Androidの最初のリリースと同時に、Apache HttpClient 4.0 APIは時期尚早に凍結する必要がありましたが、多くのインターフェースと内部構造はまだ完全には機能していませんでした。Apache HttpClient 4.0が成熟するにつれて、プロジェクトはGoogleが最新のコード改善をコードツリーに組み込むことを期待していました。残念ながらそれは起こりませんでした。

回避策(@Jinuなどで推奨)を介して古い非推奨のライブラリを引き続き使用することもできますuseLibrary 'org.apache.http.legacy'、本当に弾丸を噛んで、ネイティブAndroidなどの他の何かに更新する必要があります。HttpUrlConnectionまたは、それがニーズを満たさない場合は、あなたが使用することができますOkHttpライブラリー何で、HttpUrlConnectionされ、内部に基づいてとにかくを。

OkHttpには、Apacheクライアントと同じAPIを使用する互換性レイヤーがありますが、同じ機能のすべてを実装しているわけではないため、実際の距離は異なる場合があります。

一方で、Apacheのクライアントの新しいバージョンをインポートすることが可能である(@MartinPfefferにより示唆されるように)、それはあなたが前に使用していたクラスやメソッドのほとんどは廃止されている可能性がありますし、更新がバグを導入することをかなり大きな危険性がありますコード内(たとえば、以前プロキシの背後から機能していたいくつかの接続が機能しなくなったことがわかりました)ので、これは優れたソリューションではありません。


1

この問題に何日も費やした後、私はなんとかそれを解決することができました。残念ながら、拡張ファイルを使用する場合に必要です。ソリューションはここの数人の人々によって提供されましたが、私にとって答えは私にとって多くの時間を節約することができたいくつかのマイナーな詳細が欠けていました。これは、私のような初心者が貴重な時間を節約するための一連のイベントです。

まず、D:\ Users \ Imre \ AppData \ Local \ Android \ sdk1 \ extras \ google \ play_licensingから「ライブラリ」フォルダをプロジェクトにインポートし、「ファイル」、「新規」、「モジュールのインポート」に移動して「ライブラリ」フォルダに移動します。SDK Managerを開いて、ポップアップ画面の下部にある[Launch Standalone SDK Manager]をクリックすると、下部の[Extras]フォルダーにポインターを合わせると、小さな黄色の情報でどこにあるかがわかりますインポートする必要があるパッケージ。

それが完了したら、左側のペインの「ライブラリ」セクションに移動し、「プロジェクト」を選択して、その中に「Android」タブを開きます。ライブラリのjavaセクションを開き、APKExpansionPolicyクラスを開きます。エラーがあり、インポートorg.apache.http.NameValuePairとインポートorg.apache.http.client.utils.URLEncodedUtilsが淡い灰色の場合は、build.gradle(Project:whatever)を開き、「buildscript」でそれを確認します「依存関係」の下に「クラスパス 'com.android.tools.build:gradle:1.5.0」が含まれています。1.5.0はお客様のケースでは異なる場合があります。それはあなたのスタジオのバージョンに依存すると思います。鉱山は1.5.1です。あなたの方が新しい場合は、番号を更新するように通知されます。

その後、「build.gradle(Module:library)」に移動し、「useLibrary 'org.apache.http.legacy」を「android」セクションに含めます。今すぐ同期(R / H上隅)を提供する必要があります。やれ。

さらにエラーメッセージが表示された場合(私はそれを他の方法で行ったのでわかりません)、Apacheがサポートされなくなったため、Apacheファイルがプロジェクトから欠落している可能性があります。それらをC / D:Users / Yourname / AppData / Local / Android / Sdk / platforms / android-23 / optionalで見つけ、コピーしてyourproject / app / libsフォルダーに貼り付けます。そこにoptional.jsonとorg.apache.http.legacy.jarファイルがあるはずです。あなたはApacheのウェブサイトに行き、最新バージョンをダウンロードする方が良いかもしれません:http ://hc.apache.org/downloads.cgi どこでもそれを解凍し、それを開き、「lib」に移動し、httpclient-4.5.1をコピーします.jarファイルを作成し、org.apache.http.legacy.jarファイルをそれで置き換えます。

プロジェクトを同期して再ビルド/クリーンアップすれば、問題はありません。

念のため、ターミナル(Android StudioのL / H下部)を開き、「gradlew clean」と入力してください。いくつかのものがインストールされます。完了したら、「gradlew Assemble」と入力します。完了するまで数分かかりますが、コースがある場合はエラーが発生します。ターミナルに何も入力できない場合は、コマンドプロンプト(Windowsボタン+ R)を起動し、cmdと入力して[OK]をクリックし、小さな黒いポップアップ画面のタイトル(C:\ WINDOWS \ system32 \ cmd.exe)を右クリックします。 、プロパティ、オプション、ウィンドウの下部で、「レガシーコンソールを使用する」が太くなっていることを確認します。A.Studioを再起動します。

幸運を!


1

上記の回答がどれも完全に機能しなかったため、投稿する必要がありました。

Android Studioを使用しています

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

compileSdkVersion 23
buildToolsVersion "23.0.3"

ステップ1:最新のjarファイルをダウンロードする(http://www-eu.apache.org/dist//httpcomponents/httpclient/binary/httpcomponents-client-4.5.2-bin.zip

ステップ2:.jarファイルをコピーして、モジュール(アプリまたはライブラリの可能性があります)のlibsフォルダー(まだ存在しない場合は作成)に貼り付けます。

ステップ3:jarを右クリックして[ライブラリとして追加]をクリックします。モジュールのgradleファイルに依存関係としてjarファイルを自動的に追加します

ステップ4:これで自動的に問題が解決されますが、アプリでプロガードを使用している場合は、クラスファイルの重複について警告が表示され、ビルドできません。これは既知のバグであり、プロガードルールに以下を追加する必要があります

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

幸運を!


0

私の場合、私は私のandroidプロジェクトのライブラリの1つを更新しました。

キャッシュストレージソリューションとしてReservoirを使用しています:https : //github.com/anupcowkur/Reservoir

私はから行きました:

compile 'com.anupcowkur:reservoir:2.1'

に:

compile 'com.anupcowkur:reservoir:3.1.0'

ライブラリの作成者がリポジトリからcommons-ioライブラリを削除したため、私のアプリは動作しなくなりました。

これをgradleに追加してcommons-ioを手動で含める必要がありました:

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

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.