Як додати Apache HTTP API (застарілий) як залежність від часу компіляції до build.grade для Android M?


96

Як згадувалося тут , Android M не підтримуватиме HTTP API Apache. У документах зазначено:

використовуйте замість цього клас HttpURLConnection.

або

Щоб продовжувати використовувати API-інтерфейси Apache HTTP, спочатку потрібно оголосити таку залежність часу компіляції у файлі 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 для Android. Я здогадуюсь, що це дійсно нове, тобто вам потрібно щось подібне 1.3.0-rc2. Ви також можете скористатися власною сумісною для Android версією HttpClient .
CommonsWare

Дякуємо за швидку відповідь @CommonsWare ... Ви маєте на увазі рядок "classpath" com.android.tools.build:gradle:1.0.0 "" у файлі build.gradle верхнього рівня?
Вірат Сінгх

1
Так. Я буду досить здивований, якщо 1.0.0є useLibraryріч. Можливо, що він пробрався раніше, ніж 1.3.x, тож ви можете спробувати 1.2.3(AFAIK, остання версія випуску) і подивитися, що відбувається.
CommonsWare

Я щойно спробував "1.2.3", і не пощастило - та сама помилка -> "Метод Gradle DSL не знайдено: 'useLibrary ()'": /
Вірат Сінгх

Так, оскільки це пов’язано з попереднім переглядом розробника M, я не в шоці від цього. Ймовірно, вам потрібно 1.3.0-rc2(або щось нове, якщо воно є).
CommonsWare

Відповіді:


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, а потім оголошую useLibrary для apache, але потім також я отримаю помилку: Помилка: (204, 13) помилка: не вдається знайти клас символів DefaultHttpClient Error: (204, 48) помилка: не вдається знайти клас символів DefaultHttpClient Error: (205, 13) помилка: не вдається знайти клас символу HttpPost Помилка: (205, 37) помилка: не можна знайти клас символів HttpPost Помилка: (207, 13) помилка: не вдається знайти клас символу HttpResponse Помилка: (208, 13) помилка: не може знайти клас символів HttpEntity Помилка: (209, 19) помилка: не вдається знайти змінну символу EntityUtils
Varnit Khandelwal

1
Щось, що я пропустив із відповіді: Ви повинні переконатися, що шлях до класу gradle знаходиться у файлі збірки верхнього рівня ваших програм, де це useLibraryмає бути у вашому файлі збірки.
Graeme

Також не забудьте додати цей файл jar , щоб наведене вище рішення працювало :)
Шераз Ахмад Хільджі

@Sheraz, який більше не потрібен - збірка gradle піднімає його автоматично
Річард Ле Мес'єр

1
@Ratul ви повинні додати packagingOptions {}блок всередині androidблоку, всередину цього блоку додати exclude 'META-INF/LICENSE'... (повідомляється кожен рядок на дублікат файлу)
hidro

28

Інша альтернатива - просто додати залежність 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

Його не можна скомпілювати: Помилка: Помилка виконання для завдання ': <Proj>: пакет <Proj> Налагодження'. > Неможливо обчислити хеш /Users/<user>/Documents/<Proj>/<Activity>/build/intermediates/classes-proguard/<Proj>/debug/classes.jar
Юрій Чернишов

Ви спробували компілювати (відновлювати) без захисту?
nexDev

Ви можете показати зразок проекту, який працює з цим? Тепер я отримую цю помилку: Помилка: Помилка виконання для завдання ': app: packageAllSyncmeappDebugClassesForMultiDex'. > java.util.zip.ZipException: копія запису: org / apache / http / annotation / GuardedBy.class
андроїд розробник

Ну, тип помилки у вас здається специфічним для вашого проекту. У вас є дублікати пакетів apache. Один, очевидно, в org.jbundle. .... а інший десь в одній із ваших бібліотек. Я б шукав дублікат пакету в:
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) Метод Gradle DSL не знайдено: 'provided ()'
RoFF 03.03.16

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.
Джо Боубір,

Коли клас застарілий, зазвичай спочатку його приховують, щоб запобігти його використанню в майбутньому. Тоді його можна буде видалити з часом. Щось на зразок: 1. позначити як застарілу в поточній версії. 2. приховати у другій версії. 3. рефакторизуйте весь код, щоб повністю виключити старий клас.
Кодер Роуді,

0

Щоб вирішити проблеми, переконайтеся, що ви використовуєте інструменти побудови версії "23.0.0 rc2" із такими інструментами побудови gradle:

classpath 'com.android.tools.build:gradle:1.3.0-beta2'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.