Android Mのbuild.gradeにコンパイル時の依存関係としてApache HTTP API(レガシー)を追加する方法


96

ここで説明したよう、Android MはApache HTTP APIをサポートしません。ドキュメントは次のように述べています:

代わりにHttpURLConnectionクラスを使用してください。

または

Apache HTTP APIを引き続き使用するには、まずbuild.gradleファイルで次のコンパイル時の依存関係を宣言する必要があります。

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

プロジェクトでのHttpClientの使用方法の多くをHttpURLConnectionに変換しましたが、まだいくつかの領域でHttpClientを使用する必要があります。したがって、「org.apache.http.legacy」をコンパイル時の依存関係として宣言しようとしていますが、build.gradleでエラーが発生しています。

Gradle DSLメソッドが見つかりません: 'useLibrary()'

私の質問は、「org.apache.http.legacy」をプロジェクトのコンパイル時の依存関係としてどのように宣言するのですか?

どんな助けでも大歓迎です。ありがとう


3
かなり最近のGradle for Androidプラグインを使用していることを確認してください。私の推測では、これは本当に新しいものです1.3.0-rc2。つまり、のようなものが必要になるでしょう。また、Apache独自のAndroid互換エディションのHttpClientの使用を検討することもできます
CommonsWare

@CommonsWareの迅速な対応に感謝...トップレベルのbuild.gradleファイルの「classpath 'com.android.tools.build:gradle:1.0.0'」行を参照していますか?
Virat Singh 2015

1
はい。場合、私はかなり驚かれることでしょう1.0.0持っているuseLibrary事を。1.3.xより前に1.2.3侵入した可能性があるため、(最新の製品リリースであるAFAIK)を試して何が起こるかを確認できます。
CommonsWare、2015年

私は '1.2.3'を試してみましたが、運が悪かった-同じエラー-> "Gradle DSL method not found: 'useLibrary()'":/
Virat Singh

ええ、これはM Developer Previewに関連付けられているので、私はそれにショックを受けていません。おそらくあなたは必要です1.3.0-rc2(もしあれば新しいものがあります)。
CommonsWare、2015年

回答:


172

API 23の場合:

トップレベルのbuild.gradle-/build.gradle

buildscript {
    ...
    dependencies {
        classpath 'com.android.tools.build:gradle:1.3.1'
    }
}
...

モジュール固有のbuild.gradle-/app/build.gradle

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

公式ドキュメント(プレビュー用):http : //developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-apache-http-client

最新のAndroid Gradleプラグインの変更ログ:http : //tools.android.com/tech-docs/new-build-system


2
Gradleビルドバージョンを更新し、apacheのuseLibraryも宣言しますが、次のエラーも発生します:エラー:(204、13)エラー:シンボルクラスが見つかりませんDefaultHttpClientエラー:(204、48)エラー:シンボルクラスが見つかりませんDefaultHttpClientエラー: (205、13)エラー:シンボルクラスが見つかりませんHttpPostエラー:(205、37)エラー:シンボルクラスが見つかりませんHttpPostエラー:(207、13)エラー:シンボルクラスが見つかりませんHttpResponseエラー:(208、13)エラー:できませんシンボルクラスを検索HttpEntityエラー:(209、19)エラー:シンボル変数EntityUtilsが見つかりません
Varnit Khandelwal

1
私が回答から逃したもの:gradleクラスパスがアプリの最上位ビルドファイルにあるuseLibraryことを確認する必要があります。
Graeme

上記のソリューションを機能させるために、このjarファイルを追加することも忘れないでください:)
Sheraz Ahmad Khilji '10

@Sherazは不要になりました-Gradleビルドが自動的にピックアップします
Richard Le Mesurier 2015年

1
@Ratul packagingOptions {}ブロック内にandroidブロックを追加する必要があります。このブロック内に追加しexclude 'META-INF/LICENSE'ます...(重複するファイルごとに各行が報告されます)
hidro

28

もう1つの方法は、jbundle依存関係を追加することです。Android Studioは「シンボルを解決できません...」というメッセージを表示しないので、これはAndroid Studioによりフレンドリーです。

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

mavenCentral()リポジトリで利用できます。
nexDev 2015

コンパイルできません:エラー:タスク ':<Proj>:package <Proj> Debug'の実行に失敗しました。> /Users/<user>/Documents/<Proj>/<Activity>/build/intermediates/classes-proguard/<Proj>/debug/classes.jarのハッシュを計算できません
Yuriy Chernyshov

プロガードなしでコンパイル(再構築)を試みましたか?
nexDev

これで動作するサンプルプロジェクトを見せていただけますか?今、私はこのエラーを受け取ります:Error:Execution failed for task ':app:packageAllSyncmeappDebugClassesForMultiDex'。> java.util.zip.ZipException:重複したエントリ:org / apache / http / annotation / GuardedBy.class
android developer

まあ、あなたが持っているエラーの種類はあなたのプロジェクトに固有のようです。apacheパッケージが重複しています。明らかにorg.jbundleにあります。....もう1つは、ライブラリの1つのどこかにあります。:私は、内の重複パッケージを探します
nexDev


13

あなたのbuild.gradleファイルに追加useLibrary「org.apache.http.legacy」あたりとしてAndroid 6.0 Changes> Apache HTTP Client Removalノートを。

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

ミッシングリンクエラーを回避するには、依存関係を追加します

dependencies {
    provided 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
}

「提供」を使用すると、依存関係はAPKに含まれません


11

:ただ、ファイルコピーorg.apache.http.legacy.jarからAndroid/Sdk/platforms/android-23/optionalフォルダプロジェクトフォルダにをapp/libs

23.1.1のチャームのように動作しました。


2

私はこの問題を次のように解決しました:

1.)GUGが言及したように、トップレベルのビルドファイルにクラスパスを設定します。

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.3.0-beta2'
    }
    allprojects {
        repositories {
           jcenter()
        }
    }
}

2.)特定のモジュールのビルドファイル:

android {
   useLibrary 'org.apache.http.legacy'
   compileSdkVersion 'android-MNC'
   buildToolsVersion '23.0.0 rc3'
}

2

答えが少し古いので、私は自分の解決策(私にとってうまくいったもの)を置きます、それは他の誰かにとって役立つかもしれません...私はApache の公式ドキュメントから私の解決策をとりました、回避策はありません。

1 /グラドル:

dependencies {
...
// This is the maintained version from apache.
compile group: 'cz.msebera.android', name: 'httpclient', version: '4.4.1.1'
}

アプリの残りの2 /を置き換えるorg.apache.httpことでcz.msebera.android.httpclient、すべてのあなたの輸入(依存関係)が固定されます。Ctrl + Shift + Rを実行して、プロジェクト全体で置き換えることができます。


2

それは役立つはずです:

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

ミッシングリンクエラーを回避するには、依存関係を追加します

dependencies {
    provided 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
}

または

dependencies {
    compileOnly 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
}

なぜなら

Warning: Configuration 'provided' is obsolete and has been replaced with 'compileOnly'.

または、両方が機能するように提供する代わりにコンパイルを与える
logeshwaran

上記の設定で、エラー:(
155、0

1

FWIW Apacheライブラリの削除は少し前に予告されました。私たちの親友であるジェシーウィルソンは、2011年に手がかりをくれました:http : //android-developers.blogspot.com/2011/09/androids-http-clients.html

Googleは少し前にApacheHTTPClientでの作業を停止したため、メンテナがコードを更新しない限り、依然依存しているライブラリを非推奨ライブラリのリストに追加する必要があります。

<rant> Apache HTTPクライアントを使い続けることを主張した人々との技術的な議論の数は言えません。私の名前を挙げられていない以前の雇用主の管理者が彼らのトップエンジニアの話を聞いていなかったか、警告を無視したときに彼らが何を話しているのかを知らなかったために壊れるいくつかの主要なアプリがあります...橋。

私の勝ち。

</rant>


1
私の理解では、Apache HttpClientはandroid-23に隠されていますが、実際には削除されていません。削除すると、HttpClientが非表示になっていない、以前のプラットフォームをターゲットとする既存のクライアントの多くが破損し、これらの既存のアプリは引き続きAndroid-23で実行されることが予想されます。android-23では、useLibraryを追加すると、これらのレガシークラスがブートクラスパス、つまりプラットフォームによって提供されるクラスのリストに追加されます。これは本質的にandroid-23のクラスを再表示します。
Joe Bowbeer、2015年

クラスが廃止された場合、今後使用されるのを防ぐために、まずクラスを非表示にするのが一般的です。その後、時間の経過とともに削除できます。次のようなものです。1.現在のバージョンで非推奨としてマークします。2. 2番目のバージョンで非表示にします。3.すべてのコードをリファクタリングして、古いクラスを完全に削除します。
Coder Roadie

0

この問題を解決するには、ビルドツールのバージョン「23.0.0 rc2」と次のツールビルドグラドルの依存関係を使用していることを確認してください。

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