Android Gradle Apache HttpClient mevcut değil mi?


263

IntelliJ projesini Android Studio'nun Gradle sistemine dönüştürmeye çalışıyorum ama Apache HttpClient ile ilgili hatalarla karşılaşıyorum? Bir şey eksik miyim, aldığım hatalar aşağıdaki gibidir:

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 dosyam aşağıdaki bağımlılıklara sahip:

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

Pek çok insan benzer bir sorun yaşıyor gibi görünüyor, ancak ne SO ne de Google'ın bir çözümü yok, bu yüzden bu sorunun gelecekteki arama yapanlara yardımcı olacağını umuyorum.

Yanıtlar:


39

Kullanımdan kaldırılan apache HttpClient'i yeni HttpURLConnection ile değiştirmenizi öneririm.

Bu daha temiz bir çözümdür, taşınması oldukça kolaydır ve genellikle en son SDK değişikliklerine hack / yama / geçici çözüm denemekten daha iyidir: genellikle daha sonra pişman olursunuz :)

Aşama 1

HttpGet httpGet = new HttpGet(url);

dönüşür:

URL urlObj = new URL(url);

Adım 2

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

dönüşür:

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

Adım 2 bis

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

dönüşür:

int status = urlConnection.getResponseCode();

Hey @Benjamin, PUT yöntemiyle URL nasıl gönderilir?
Dharma Sai Seerapu

@TrickySolutions Üzgünüz hiçbir fikrim yok, henüz PUT yöntemini kullanmadım.
Benjamin Piette

521

23 olarak hedef sdk kullanıyorsanız build.gradle içinde aşağıdaki kodu ekleyin

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

ve buildscript'inizi

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

daha fazla bilgi için bu bağlantıyı takip edin


7
buildscript'inizi 'com.android.tools.build:gradle:1.3.0' sınıf yoluna değiştirin
Jinu

3
Zaten 1.3.1 vardı. Android Studio içindeki sınıfları hala çözemiyorum:Error:(14, 23) error: package org.apache.http does not exist
Henrique de Sousa

2
android studio 1.4 beta 2
Jinu

2
Peki ya apache http bileşenlerinin en son sürümünü kullanmak isterseniz?
russellhoff

2
Thanx Jinu, Android Studio'nun 1.3'ten yukarıdaki sürüme güncellenmesi gerekiyor. Anladım
mithil1501

94

Bu sorunu yaşadım ve sonra bu sayfaları buldum: Burada apache kütüphanesinin kullanımdan kaldırıldığını görebilirsiniz, ancak kaldırılmadı, bu yüzden çalışması gerekir. Öyle değil.

Bkz .

Ve burada projenize apache kütüphanesinin nasıl dahil edileceğini görebilirsiniz

Bkz .

İkinci bağlantıda tavsiye edildiği gibi build.gradle dosyasına aşağıdaki komutu ekleyerek sorunu çözdüm.

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

Ancak bu yalnızca 1.3.0-beta2 veya daha büyük bir sürüm kullanıyorsanız çalışır, bu nedenle daha düşük bir sürümdeyseniz derleme bağımlılıkları oluşturmak için bunu eklemeniz gerekir:

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

Bu yardımcı olur umarım.


Benim için başarısız oldu: Hata: '' xenoAmp: mergeDebugJavaResources 'görevi için yürütme başarısız oldu. > L: \ Projekty \ xenoampgit \ xenoAmp \ build \ ara ürünler \ packedgedJarsJavaResources \ debug \ httpclient-android-4.3.5.1.jar1037172435 \ META-INF \ LICENSE için L: \ Projekty \ xenoampgit \ xenoAmp \ build klasörleri belirlenemiyor \ intermediates \ sourceFolderJavaResources \ debug, L: \ Projekty \ xenoampgit \ xenoAmp \ build \ ara ürünler \ packagedJarsJavaResources \ debug
ssuukk 31:15

@ssuukk Merhaba, bu hataya bir çözüm buldunuz mu?
CeccoCQ

2
Maalesef çözüm, hedefi mevcut en yüksek API'ye değiştirmekti ve bu çok şey kırdı! Sonra "useLibrary", "sınıf yolu" PLUS referans eski apache lib, bu soru başka bir yerde açıklandığı gibi eklemek zorunda kaldı. Ve tekrar derlendikten sonra Apache kodunu tamamen indirmeye ve hepsini düşündüğümden daha kolay olan URLConnection ile değiştirmeye karar verdim.
ssuukk

Ssuukk ile aynı fikirde. Bu cevapların hiçbiri benim için işe yaramadı, bu yüzden Apache kütüphanelerinden de kurtuldum. Android geliştirmede oldukça yeniyim ama çok basitti.
John81

Aynı sorunu yaşadım ve Milos'un nasıl dediğini useLibrary 'org.apache.http.legacy' ile düzelttim ... ancak sorununuzla ilgili ssuukk için bunu her zaman eklemeyi deneyebilirsiniz: android {packingOptions {hariç tut 'META-INF / LICENSE 'hariç tut' META-INF / BAĞIMLILIKLAR 'hariç' META-INF / DİKKAT 'hariç' META-INF / NOTICE.txt 'hariç' META-INF / MANIFEST '}}
Alexiscanny

53

Bu kütüphaneyi içine ekle build.gradle

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

birisi bunu açıklayabilir mi? Bu neden işe yarıyor? Bağımlılıkları eklemenin yanı sıra neden bu satırı eklememiz gerekiyor?
Dan

2
@Dan org.apache.http kütüphanesinin sürüm 23 ile kaldırılmış olması nedeniyle
eltiare

build.gradle
Açıklığa

37

kopya org.apache.http.legacy.jarolduğu Android/Sdk/platforms/android-23/optionaliçin klasöreapp/libs

ve bu satırı app.gradle dosyasına da ekledi

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

Ancak daha fazla kavanoz kitaplığı kullanıyorsanız, bu şekilde kullanabilirsiniz

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

2
Projelerimden bir diğerinde bu, +1 ve teşekkürler çalışan tek cevap olduğunu kanıtladı.
Apqu

cevap neden bu değil?
16'da dibble

1
Benim için de aynı. Birisi şimdi kabul ettiği cevap yerine bu cevabı kabul etmelidir.
Ivan Fazaniuk

Bu, en düşük direnç yoludur, dereceyi düşürmek istediğimden emin değilim. Benim için iyi derlendi.
Ed Manners

Teşekkürler! Bu, gradle-deneysel 0.6.0-alpha5 eklentisi ile çalışır. "useLibrary", deneysel eklentide yok gibi görünüyor.
maymun0506

14

Temel olarak yapmanız gereken tek şey:

useLibrary  'org.apache.http.legacy'

Sizin için build.gradledosyanın.


9

Ben de aynı sorunla karşılaştım. Daniel Nugent'in cevabı biraz yardımcı oldu (tavsiyelerini takip ettikten sonra HttpResponsebulundu - ama HttpClienthala eksikti).

İşte benim için sabit olan şey:

  1. (daha önce yapılmadıysa, önceki içe aktarma ifadelerini kullanıma sunun)
  2. http://hc.apache.org/downloads.cgi adresini ziyaret edin
  3. olsun 4.5.1.zipikili bölümünden
  4. Bunu halletmek ve yapıştırın httpcore-4.4.3ve httpclient-4.5.1.jariçinde project/libsklasörün
  5. kavanoza sağ tıklayın ve Kitaplık olarak ekle'yi seçin .

Umarım yardımcı olur.


9

Benzer problemlerle karşılaştım, benzer bir yöntem kullanarak çalışmasını sağlayabilirsiniz.

İlk olarak, mevcut yapılandırma ile bu deneyin, dışlamak httpclientdan 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'
} 

Benim durumumda, aşağıdaki kavanozları kullanarak düzelttim:

Ardından, build.gradle içinde hariç httpclientdan 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'
}

Cevabınız için teşekkürler, korkarım ne de benim için çalıştı :(
Apqu

@tur bu garip, ikinci seçenek benim için çalıştı. İkinci seçenek için eski kavanoz dosyalarınızın silindiğinden emin olun.
Daniel Nugent

Ne libs/core.jariçin?
IgorGanapolsky

7

Jinu ve Daniel tarafından Mükemmel Cevap

Buna ekleyerek, compileSdkVersion öğeniz 19 ise (Bunu DURUMDA) Sorunu Bunu Kullanarak çözdüm

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'

başka compileSdkVersion 23 ise kullanın

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

Yaptığım şey bu ve benim için de işe yarıyor.

1. adım: bunu build.grade'e ekleyin (modül: uygulama)

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

2. adım: projeyi senkronize edin ve bitti.


Aşağı oylama için herhangi bir neden var mı?
NOT_A_PROGRAMMER

"Çözümlenemedi: org.jbundle.util.osgi.wrapped: org.jbundle.util.osgi.wrapped.org.apache.http.cli‌ ‌ ent: 4.1.2" hatasıyla çözümlenemedi. Deneysel seviye 0.6.0-beta kullanıyorum. anlayabilir misin
RoFF

1

Stok Android'de sağlanan Apache HTTP istemcisinin sürümü çok eskiydi .

Google Android 1.0, Apache HttpClient'in BETA öncesi bir anlık görüntüsüyle yayınlandı. İlk Android sürümüyle çakışmak için Apache HttpClient 4.0 API'lerinin vaktinden önce dondurulması gerekiyordu, ancak birçok arayüz ve iç yapı hala tam olarak çalışmıyordu. Apache HttpClient 4.0 olgunlaştıkça proje Google'ın en son kod geliştirmelerini kod ağaçlarına dahil etmesini bekliyordu. Maalesef olmadı.

Eğer iken olabilir aracılığıyla eski kaldırılan kütüphane kullanmaya devam useLibrary 'org.apache.http.legacy'(@Jinu ve başkaları tarafından önerilen) geçici çözüm, gerçekten başka bir şey mermi ve güncelleştirme ısırmaya gerekir, örneğin yerel Android HttpUrlConnectionveya bu ihtiyaçlarınızı karşılamıyorsa, kullanabileceğiniz OkHttp kütüphanesi nedir, HttpUrlConnectionbir içten dayalı oldu Neyse.

OkHttp aslında Apache istemcisi ile aynı API'yı kullanan bir uyumluluk katmanına sahiptir, ancak aynı özelliklerin tümünü uygulamazlar , böylece kilometreniz değişebilir.

Apache istemcisinin daha yeni bir sürümünü (@MartinPfeffer tarafından önerildiği gibi) içe aktarmak mümkün olsa da, daha önce kullandığınız sınıfların ve yöntemlerin çoğunun kullanımdan kaldırılmış olması ve güncellemenin hataları getirme riski oldukça yüksektir (örneğin daha önce bir proxy arkasında çalışan bazı bağlantıları buldum artık işe yaramadı), bu yüzden bu harika bir çözüm değil.


1

Konu üzerinde gün geçirdikten sonra nihayet çözmeyi başardım. Ne yazık ki, genişletme dosyalarını kullanmak istiyorsak buna ihtiyacımız var. Çözüm burada birkaç kişi tarafından sağlandı, ancak benim için cevaplar benim için çok zaman kazandırabilecek birkaç küçük ayrıntıyı kaçırıyordu. Değerli zamanınızı kurtarmak için benim gibi acemiler için olay sırası.

Öncelikle "kütüphane" klasörünü D: \ Users \ Imre \ AppData \ Local \ Android \ sdk1 \ extras \ google \ play_licensing öğesinden Dosya, Yeni, İçe Aktarma Modülü'ne gidip "kütüphane" klasörüne giderek projeye aktardım. SDK Yöneticisi'ni açar ve açılır ekranın altındaki "Bağımsız SDK Yöneticisi'ni Başlat" ı tıklarsanız, işaretçinizi alt kısımdaki "Ekstralar" klasörünün üzerine getirebilirsiniz ve küçük sarı bilgi size nerede bulacağınızı söyleyecektir. İçe aktarmanız gereken paket.

Bu yapıldıktan sonra, "Project" ile sol bölmedeki "kütüphane" bölümüne gidin ve içinde "Android" sekmesi açın. Kütüphanenin java bölümünü açın ve APKExpansionPolicy sınıfını açın. Hatalarınız varsa ve import org.apache.http.NameValuePair ve import org.apache.http.client.utils.URLEncodedUtils soluk gri renkteyse, build.gradle (Project: whatever) dosyasını içe aktarın ve "buildscript" içinde olduğundan emin olun. "bağımlılıklar" altında "sınıfyolu" com.android.tools.build:gradle:1.5.0 "dahil. 1.5.0 sizin durumunuzda farklı olabilir. Sanırım Studio sürümünüze bağlı. Benimki 1.5.1. Sizinkinden daha yeniyse, sayıları güncellemeniz hatırlatılacaktır.

Bundan sonra, "build.gradle (Modül: kütüphane) 'ye gidin ve" android "bölümüne" useLibrary' org.apache.http.legacy 'yi ekleyin. Şimdi Senkronize Et (Sağ / Sol üst köşe) sunulmalıdır. Yap.

Daha fazla hata mesajı alırsanız (başka bir şekilde yaptım çünkü bunu bilemezdim), Apache dosyaları artık desteklenmediği için projenizden eksik olabilir. Bunları C / D: Kullanıcılar / Soyadı / AppData / Yerel / Android / Sdk / platformlar / android-23 / isteğe bağlı olarak bulun ve kopyalayın / proje / app / libs klasörünüze kopyalayın / yapıştırın. Orada isteğe bağlı bir .json ve bir org.apache.http.legacy.jar dosyanız olmalıdır. Apache'nin web sitesine gidip en yeni sürümü indirerek daha iyi olabilirsiniz: http://hc.apache.org/downloads.cgi İstediğiniz yerden açın, açın, "lib" e gidin, httpclient-4.5.1 kopyalayın .jar dosyasını değiştirin ve org.apache.http.legacy.jar dosyasını onunla değiştirin.

Projenizi senkronize edin ve yeniden oluşturun / temizleyin; devam etmeniz iyi olacaktır.

Her ihtimale karşı, terminalinizi açın (Android Studio'nun Sol / Sağ alt kısmı) ve "gradlew clean" yazın. Birkaç şey yükleyecek. Tamamlandığında, "gradlew assemble" yazın. İşlemin tamamlanması birkaç dakika sürecektir, ancak elbette varsa hatalar verecektir. Terminalde hiçbir şey yazamıyorsanız, komut istemini başlatın (Windows düğmesi + R), cmd yazın, Tamam'a basın, küçük siyah açılır ekranın başlığına sağ tıklayın (C: \ WINDOWS \ system32 \ cmd.exe) , Özellikler, Seçenekler, pencerenin altındaki "Eski konsolu kullan" ın kalın olup olmadığını kontrol edin. A.Studio'yu yeniden başlatın.

İyi şanslar!


1

Yukarıdaki yanıtların hiçbiri benim için tamamen işe yaramadığı için postalamak zorunda kaldım.

Android Studio kullanıyorum

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

compileSdkVersion 23
buildToolsVersion "23.0.3"

Adım 1: En son kavanoz dosyasını indirin ( http://www-eu.apache.org/dist//httpcomponents/httpclient/binary/httpcomponents-client-4.5.2-bin.zip )

Adım 2: .jar dosyasını modülünüzdeki libs klasörüne kopyalayın (zaten oluşturmadıysanız oluşturun) (uygulama veya kitaplık olabilir)

Adım 3: Kavanoza sağ tıklayın ve "Kütüphane Olarak Ekle". Jar dosyasını modülünüzün gradle dosyasına otomatik olarak bağımlılık olarak ekler

Adım 4: Artık sorununuz otomatik olarak çözülecek, ancak uygulamanızda koruma kullanmanız durumunda, yinelenen sınıf dosyaları hakkında uyarı verecektir ve oluşturmanıza izin vermeyecektir. Bu bilinen bir hatadır ve koruma kurallarınıza aşağıdakileri eklemeniz gerekir

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

İyi şanslar!


0

Benim durumumda, android projemdeki kütüphanelerimden birini güncelledim.

Reservoir'ı önbellek depolama çözümüm olarak kullanıyorum: https://github.com/anupcowkur/Reservoir

Ben gittim:

compile 'com.anupcowkur:reservoir:2.1'

Kime:

compile 'com.anupcowkur:reservoir:3.1.0'

Uygulamamın artık çalışmaması için kütüphane yazarının ortak kütüphaneyi depodan kaldırmış olması gerekir.

Ben bunu gradle ekleyerek commons-io el ile dahil etmek zorunda kaldı:

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

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


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.