Android M için build.grade için derleme zamanı bağımlılığı olarak Apache HTTP API (eski) nasıl eklenir?


97

Belirtildiği gibi burada , Android M'nin Apache HTTP API destek vermeyeceğini söyledi. Dokümanlar şunları belirtir:

bunun yerine HttpURLConnection sınıfını kullanın.

veya

Apache HTTP API'lerini kullanmaya devam etmek için, önce build.gradle dosyanızda aşağıdaki derleme zamanı bağımlılığını bildirmelisiniz:

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

Projemin çoğunu HttpClient kullanımını HttpURLConnection'a dönüştürdüm, ancak yine de HttpClient'i birkaç alanda kullanmam gerekiyor . Bu nedenle, derleme zamanı bağımlılığı olarak 'org.apache.http.legacy'yi ilan etmeye çalışıyorum ancak build.gradle'da bir hata alıyorum:

Gradle DSL yöntemi bulunamadı: 'useLibrary ()'

Sorum şu: 'org.apache.http.legacy'yi projemde derleme zamanı bağımlılığı olarak nasıl ilan ederim?

Herhangi bir yardım çok takdir edilmektedir. Teşekkürler


3
Oldukça yeni bir Gradle for Android eklentisi kullandığınızdan emin olun. Tahminimce bu gerçekten yeni, yani bir şeye ihtiyacınız olacak 1.3.0-rc2. Ayrıca Apache'nin kendi HttpClient Android uyumlu sürümünü kullanmayı da düşünebilirsiniz .
CommonsWare

Hızlı yanıt için teşekkürler @CommonsWare ... En üst düzey build.gradle dosyasındaki "sınıf yolu" com.android.tools.build:gradle:1.0.0 "satırına mı atıfta bulunuyorsunuz?
Virat Singh

1
Evet. Bir şeye 1.0.0sahip olursa oldukça şaşıracağım useLibrary. 1.3.x'ten önce devreye girmiş olması mümkündür, böylece deneyebilir 1.2.3(AFAIK, en son üretim sürümü) ve ne olduğunu görebilirsiniz.
CommonsWare

Az önce '1.2.3'ü denedim ve şansım yok - aynı hata -> "Gradle DSL yöntemi bulunamadı:' useLibrary () '": /
Virat Singh

Evet, bu M Developer Preview ile bağlantılı olduğundan, bundan şok olmadım. Muhtemelen ihtiyacınız var 1.3.0-rc2(veya varsa daha yeni bir şeye).
CommonsWare

Yanıtlar:


173

API 23 için:

Üst düzey build.gradle - /build.gradle

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

Modüle özgü build.gradle - /app/build.gradle

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

Resmi dokümanlar (ancak önizleme için): http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-apache-http-client

En son android gradle eklenti değişiklik günlüğü: http://tools.android.com/tech-docs/new-build-system


2
Gradle derleme sürümünü güncelliyorum ve sonra apache için useLibrary'yi açıklıyorum ama sonra şu hatayı alıyorum: Hata: (204, 13) hata: sembol sınıfı bulunamıyor DefaultHttpClient Error: (204, 48) hata: sembol sınıfı bulunamıyor DefaultHttpClient Error: (205, 13) hata: sembol sınıfı bulunamıyor HttpPost Hata: (205, 37) hata: sembol sınıfı bulunamıyor HttpPost Hatası: (207, 13) hata: sembol sınıfı bulunamıyor HttpResponse Hata: (208, 13) hata: yapılamıyor sembol sınıfını bul HttpEntity Hatası: (209, 19) hata: sembol değişkeni bulunamıyor EntityUtils
Varnit Khandelwal

1
Yanıttan kaçırdığım bir şey: gradle sınıf yolunun useLibrary, uygulamanıza özel derleme dosyasında olması gereken , uygulamalarınızın üst düzey derleme dosyasında olduğundan emin olmanız gerekir .
Graeme

Ayrıca yukarıdaki çözümün çalışması için bu jar dosyasını eklemeyi unutmayın :)
Sheraz Ahmad Khilji

@Sheraz artık gerekli değil - gradle yapısı onu otomatik olarak alıyor
Richard Le Mesurier

1
@Ratul, packagingOptions {}bloğun içine bir blok eklemelisiniz android, bu bloğun içine, ekleyin exclude 'META-INF/LICENSE'... (çift dosya başına her satır bildirilir)
hidro

28

Diğer bir alternatif ise sadece jbundle bağımlılığı eklemektir. Android Studio "simgesi çözülemiyor ..." mesajını vermediğinden, bu daha Android Studio dostudur.

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

mavenCentral () deposunda mevcuttur.
nexDev

Derlenemez: Hata: ': <Proj>: paket <Proj> Hata Ayıkla' görevi için yürütme başarısız oldu. > /Users/<user>/Documents/<Proj>/<Activity>/build/intermediates/classes-proguard/<Proj>/debug/classes.jar
Yuriy Chernyshov

proguard olmadan derlemeyi (yeniden oluşturmayı) denediniz mi?
nexDev

bununla çalışan örnek bir proje gösterebilir misiniz? Şimdi şu hatayı alıyorum: Hata: ': app: packageAllSyncmeappDebugClassesForMultiDex' görevi için yürütme başarısız oldu. > java.util.zip.ZipException: yinelenen giriş: org / apache / http / annotation / GuardedBy.class
android geliştiricisi

Peki, sahip olduğunuz hatanın türü projenize özgü görünüyor. Yinelenen apache paketleriniz var. Görünüşe göre org.jbundle'da bir tane. .... ve diğeri Kütüphanelerinizden birinde bir yerde. Yinelenen paketi
şurada arardım


13

Build.gradle dosyanıza > notlara göre useLibrary 'org.apache.http.legacy' ekleyin .Android 6.0 ChangesApache HTTP Client Removal

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

Eksik bağlantı hatalarını önlemek için bağımlılıklara ekleyin

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

'sağlanan' kullanıldığında bağımlılık apk'ye dahil edilmeyecektir


11

: Sadece dosyayı kopyaladığınız org.apache.http.legacy.jargelen Android/Sdk/platforms/android-23/optionalklasörüne proje klasörüne app/libs.

23.1.1 için cazibe gibi çalıştı.


2

Bu sorunu şu şekilde çözdüm:

1.) Sınıf yolunu üst düzey derleme dosyasında belirtildiği gibi GUG olarak ayarlayın:

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

2.) Belirli bir modülün derleme dosyasında:

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

2

Cevaplar biraz eski olduğu için çözümümü koyacağım (benim için işe yarayan), başkası için yararlı olabilir ... Çözümümü Apache'nin resmi belgelerinden aldım, çözüm yok.

1 / kademeli:

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

2 / app geri kalanı yerine de org.apache.httptarafından cz.msebera.android.httpclientve tüm ithalat (bağımlılıklar) düzeltilecektir. ctrl + shift + R tuşlarını kullanabilir ve tüm projede değiştirebilirsiniz.


2

yardımcı olmalı:

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

Eksik bağlantı hatalarını önlemek için bağımlılıklara ekleyin

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

veya

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

Çünkü

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

veya derleme yerine de geçerli olur işler sağlamıştır vermek
logeshwaran

yukarıdaki yapılandırma ile, Hata ile karşılaştım: (155, 0) Gradle DSL yöntemi bulunamadı: 'sağlandı ()'
RoFF

1

FWIW, Apache kitaplığının kaldırılmasının bir süre önce haberi olmuştu. İyi arkadaşımız Jesse Wilson 2011'de bize bir ipucu verdi: http://android-developers.blogspot.com/2011/09/androids-http-clients.html

Google, ApacheHTTPClient üzerinde çalışmayı bir süre önce bıraktı, bu nedenle, bakımcılar kodlarını güncellemedikçe, hala buna bağlı olan herhangi bir kitaplık, kullanımdan kaldırılan kitaplıklar listesine eklenmelidir.

<rant> Apache HTTP istemcisine bağlı kalmakta ısrar eden insanlarla ne kadar teknik tartışmam olduğunu size anlatamam. Bozulacak bazı büyük uygulamalar var çünkü adı verilemeyen önceki işverenlerimdeki yönetim, en iyi mühendislerini dinlemedi veya uyarıyı görmezden geldiklerinde ne hakkında konuştuklarını bilmiyor ... köprü.

Ben kazandım

</rant>


1
Anladığım kadarıyla Apache HttpClient android-23'te gizli ama aslında kaldırılmamış. Kaldırma, HttpClient'in gizli olmadığı ve bu mevcut uygulamaların hala android-23'te çalışması beklenen eski platformları hedefleyen birçok mevcut istemciyi kıracaktır. Android-23'te useLibrary eklenmesi, bu eski sınıfları önyükleme sınıf yoluna, yani platform tarafından sağlanan sınıflar listesine eklemeye yarar. Bu, esasen android-23'teki sınıfları gösterir.
Joe Bowbeer

Bir sınıf kullanımdan kaldırıldığında, ileride kullanılmasını önlemek için önce onu gizlemek yaygındır. Daha sonra zaman geçtikçe kaldırılabilir. Şuna benzer bir şey: 1. Mevcut sürümde kullanımdan kaldırıldı olarak işaretleyin. 2. ikinci versiyonda gizle. 3. Eski sınıfı tamamen ortadan kaldırmak için tüm kodu yeniden düzenleyin.
Coder Roadie

0

Sorunları çözmek için, "23.0.0 rc2" derleme araçları sürümünü aşağıdaki araçlarla gradle bağımlılığı oluşturduğunuzdan emin olun:

classpath 'com.android.tools.build:gradle:1.3.0-beta2'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.