Android ग्रैड अपाचे HttpClient मौजूद नहीं है?


263

मैं एक इंटेलीज प्रोजेक्ट को एंड्रॉइड स्टूडियो के ग्रैडल सिस्टम में बदलने की कोशिश कर रहा हूं, लेकिन मैं अपाचे एचटीटीपी क्लाइंट के साथ त्रुटियों में चल रहा हूं? क्या मुझे कुछ याद आ रहा है, मुझे जो त्रुटियां मिल रही हैं, वे इस प्रकार हैं:

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

ऐसा लगता है कि बहुत से लोगों को एक समान समस्या हो रही है, लेकिन न तो एसओ या Google के पास कोई समाधान है, इसलिए मैं उम्मीद कर रहा हूं कि यह प्रश्न भविष्य के खोजकर्ताओं की मदद करेगा।

जवाबों:


39

मेरा सुझाव है कि आप हटाए गए अपाचे HttpClient को नए HttpURLConnection के साथ बदलें।

यह एक क्लीनर समाधान है, इसे स्थानांतरित करना काफी आसान है, और आम तौर पर हैक / पैच / वर्कअराउंड को हैक करने की कोशिश की तुलना में नवीनतम एसडीके परिवर्तनों से चिपकना बेहतर होता है: आपको आमतौर पर बाद में पछतावा होता है :)

चरण 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 बीआईएस

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

हो जाता है:

int status = urlConnection.getResponseCode();

अरे @Benjamin, PUT विधि से URL कैसे भेजें?
धर्म साईं सेरापू

@TrickySolutions क्षमा करें कोई विचार नहीं, अभी तक PUT विधि का उपयोग नहीं किया है।
बेंजामिन पीटर

521

यदि आप अपने निर्माण में कोड के रूप में 23 जोड़ने के नीचे लक्ष्य एसडीके का उपयोग कर रहे हैं

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

और अपनी बिल्डस्क्रिप्ट को बदल दें

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

अधिक जानकारी के लिए इस लिंक का अनुसरण करें


7
classpath करने के लिए 'com.android.tools.build:gradle:1.3.0' अपने buildscript बदल
Jinu

3
पहले से ही 1.3.1 था। अभी भी एंड्रॉइड स्टूडियो के अंदर कक्षाएं हल नहीं कर सकते हैं:Error:(14, 23) error: package org.apache.http does not exist
हेनरिक डी सूसा

2
एंड्रॉइड स्टूडियो 1.4 बीटा 2
जिनू

2
और क्या होगा यदि आप अपाचे http घटकों के नवीनतम संस्करण का उपयोग करना चाहते हैं?
रुसेलफॉफ़

2
थैंक्स जिनु, एंड्रॉइड स्टूडियो को 1.3 से ऊपर के संस्करण में अपडेट करना आवश्यक है। यह काम कर रहा है
मिथिला 1501

94

मुझे यह समस्या थी और फिर ये पृष्ठ मिले: यहां आप देख सकते हैं कि अपाचे लाइब्रेरी को हटा दिया गया है, लेकिन इसे हटाया नहीं गया है, इसलिए इसे काम करना चाहिए। यह नहीं है

देख लो

और यहां आप देख सकते हैं कि अपाचे लाइब्रेरी को अपनी परियोजना में कैसे शामिल किया जाए

देख लो

मैंने अपनी बिल्ड.ग्रेड फ़ाइल के साथ जोड़कर समस्या का समाधान किया जैसा कि दूसरे लिंक में सुझाया गया है।

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

हालाँकि यह केवल तभी काम करता है जब आप १.३.०-बीटा २ या उससे अधिक का उपयोग कर रहे हैं, इसलिए यदि आप कम संस्करण पर हैं, तो आपको इसे बिल्डस्क्रिप्ट निर्भरता में जोड़ना होगा:

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

उम्मीद है की यह मदद करेगा।


मेरे लिए यह असफल रहा: त्रुटि: निष्पादन कार्य के लिए विफल रहा ': xenoAmp: mergeDebugJavaResources'। > L: \ Projekty \ xenoampgit \ xenoAmp \ build \ मध्यस्थता \ packagedJarsJavaResources \ debug \ httpclient-android-4.3.5.1.jar103717435 \ META-INFA-LICENSE के लिए फ़ोल्डर के साथ विस्तार फ़ोल्डर निर्धारित नहीं कर सकते \ मध्यवर्ती \ sourceFolderJavaResources \ डिबग, एल: \ Projekty \ xenoampgit \ xenoAmp \ बिल्ड \ मध्यवर्ती \ packagedJarsJavaResources \ debug
ssuukk

@ssuukk हाय, क्या आपको इस त्रुटि का हल मिला?
CeccoCQ

2
दुर्भाग्य से समाधान वर्तमान उच्चतम एपीआई के लिए लक्ष्य को बदलने के लिए किया गया था, और इससे बहुत कुछ टूट गया! फिर मुझे "useLibrary", "classpath" को जोड़ना था, PLUS संदर्भ विरासत अपाचे lib, जैसा कि इस प्रश्न में कहीं और वर्णित है। और यह फिर से संकलित होने के बाद मैंने बस अपाचे कोड को पूरी तरह से खोदने का फैसला किया और इसे URLConnection के साथ बदल दिया, जो कि मेरे विचार से आसान था।
ssuukk

Ssuukk से सहमत हैं। इनमें से किसी भी उत्तर ने मेरे लिए काम नहीं किया इसलिए मैंने अपाचे पुस्तकालयों से छुटकारा पा लिया। मैं Android विकास के लिए बहुत नया हूं लेकिन यह सीधा था।
जॉन'१

मेरे पास एक ही मुद्दा था और मैंने useLibrary 'org.apache.http.legacy' के साथ तय किया कि मिलोस ने कैसे कहा ... हालाँकि आपके मुद्दे के साथ @ssuukk के लिए आप हमेशा इसे जोड़ने का प्रयास कर सकते हैं: Android {पैकेजिंगओसेस {META-INF / LICENSE 'META-INF / DEPENDENCIES को बाहर करें' META-INF / NOTICE को बाहर करें 'META-INF / NOTICE.txt' को बाहर करें 'META-INF / MANIFEST'}}
Alexananny

53

इस लायब्रेरी में जोड़ें build.gradle

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

क्या कोई इसे समझा सकता है? यह काम क्यों करता है? हमें निर्भरता जोड़ने से अलग, इस पंक्ति को जोड़ने की आवश्यकता क्यों है?
दान

2
@Dan क्योंकि यह org.apache.http पुस्तकालय संस्करण 23. के साथ हटा दिया गया था
eltiare

स्पष्ट करने के लिए, यह रूट में नहीं जाता है build.gradle, बल्कि आपके द्वारा
बनाए जा

37

कॉपी org.apache.http.legacy.jarजो Android/Sdk/platforms/android-23/optionalफ़ोल्डर में हैapp/libs

और इस लाइन को app.gradle फ़ाइल में भी जोड़ा

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

लेकिन यदि आप अधिक जार पुस्तकालयों का उपयोग कर रहे हैं, तो आप इस तरह से उपयोग कर सकते हैं

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

2
मेरी अन्य परियोजनाओं में यह एकमात्र उत्तर साबित हुआ जिसने इतनी +1 और धन्यवाद का काम किया।
एपक्

क्यों यह जवाब नहीं है?
फाली

1
मेरे लिए भी वैसा ही। किसी को इस जवाब को स्वीकार करना चाहिए बजाय इसके कि अब स्वीकार किया जाए।
इवान फज़ानुक

यह प्रतिरोध का कम से कम रास्ता है, सुनिश्चित नहीं है कि मैं डाउन-ग्रेड ग्रेडल करना चाहता हूं। यह मेरे लिए ठीक संकलन है।
एड मैनर्स

धन्यवाद! यह ग्रेडल-प्रायोगिक 0.6.0-अल्फा 5 प्लगइन के साथ काम करता है। प्रायोगिक प्लगइन में "useLibrary" मौजूद नहीं है।
बंदर ०५०६

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.3और httpclient-4.5.1.jarमें project/libsफ़ोल्डर
  5. जार पर राइट-क्लिक करें और लाइब्रेरी के रूप में जोड़ें चुनें ।

आशा करता हूँ की ये काम करेगा।


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

मेरे मामले में, मैंने निम्नलिखित जार का उपयोग करके इसे ठीक किया:

फिर, 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'
}

आपके उत्तर के लिए धन्यवाद, im डर न तो मेरे लिए काम किया हालांकि :(
Apqu

@ यह अजीब है, दूसरे विकल्प ने मेरे लिए काम किया। सुनिश्चित करें कि आपकी पुरानी जार फ़ाइलों को दूसरे विकल्प के लिए हटा दिया गया है।
डैनियल नुगेंट

किस libs/core.jarलिए है?
इगोरगानापोलस्की

7

जिनू और डैनियल द्वारा सही उत्तर

इसे जोड़कर मैंने इसका उपयोग करके इस समस्या को हल किया, यदि आपका कंपाइलएसड्रोवर्सन 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.grad (मॉड्यूल: ऐप) में जोड़ें

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

चरण 2: परियोजना को सिंक करें और किया।


डाउन वोटिंग का कोई कारण?
NOT_A_PROGRAMMER

यह त्रुटि के साथ हल करने में विफल रहा "" हल करने में विफल: org.jbundle.util.osgi.wrapped: org.jbundle.util.osgi.wrapped.org.apache.http.cli the ent: 4.1.2 "। मैं प्रयोगात्मक ०.०.०-बीटा का प्रयोग कर रहा हूँ। क्या आप इसका पता लगा सकते हैं ?
रोफ

1

स्टॉक एंड्रॉइड पर उपलब्ध Apache HTTP क्लाइंट का संस्करण बहुत पुराना था

Google Android 1.0 को Apache HttpClient के प्री-बीटा स्नैपशॉट के साथ जारी किया गया था। पहली Android रिलीज अपाचे HttpClient 4.0 एपीआई के साथ मेल खाने के लिए समय से पहले जमे हुए होना था, जबकि इंटरफेस और आंतरिक संरचनाओं में से कई अभी भी पूरी तरह से काम नहीं कर रहे थे। जैसा कि Apache HttpClient 4.0 परिपक्व हो रहा था कि परियोजना Google से अपने कोड ट्री में नवीनतम कोड सुधारों को शामिल करने की उम्मीद कर रही थी। दुर्भाग्य से ऐसा नहीं हुआ।

जब आप वर्कअराउंड (@ जिन्नू और अन्य लोगों द्वारा सुझाए गए) के माध्यम से पुरानी पदावनत पुस्तकालय का उपयोग कर सकते हैं useLibrary 'org.apache.http.legacy', तो आपको वास्तव में बुलेट को काटने और कुछ और अपडेट करने की आवश्यकता है, उदाहरण के लिए देशी एंड्रॉइड HttpUrlConnection, या यदि वह आपकी आवश्यकताओं को पूरा नहीं करता है, तो आप उपयोग कर सकते OkHttp पुस्तकालय , जो क्या है HttpUrlConnectionहै आंतरिक रूप पर आधारित वैसे भी।

OkHttp में वास्तव में एक संगतता परत है जो अपाचे क्लाइंट के समान एपीआई का उपयोग करती है, हालांकि वे सभी समान सुविधाओं को लागू नहीं करते हैं , इसलिए आपका माइलेज भिन्न हो सकता है।

हालांकि यह अपाचे क्लाइंट का एक नया संस्करण आयात करना संभव है (जैसा कि @MartinPfeffer द्वारा सुझाया गया है), यह संभव है कि इससे पहले इस्तेमाल की गई अधिकांश कक्षाएं और विधियाँ आपको अपदस्थ कर दी गई हों, और एक बहुत बड़ा जोखिम है जो अद्यतन करने से कीड़े पैदा होंगे आपके कोड में (उदाहरण के लिए मुझे कुछ कनेक्शन मिले जो पहले एक प्रॉक्सी के पीछे काम कर रहे थे अब काम नहीं किया गया), इसलिए यह एक महान समाधान नहीं है।


1

विषय पर दिन बिताने के बाद, मैं आखिरकार इसे हल करने में कामयाब रहा। यदि हम विस्तार फ़ाइलों का उपयोग करना चाहते हैं तो दुर्भाग्य से हमें इसकी आवश्यकता है। यहाँ कुछ लोगों द्वारा समाधान प्रदान किया गया है, लेकिन मेरे लिए उत्तर कुछ मामूली विस्तार से गायब थे जो मेरे लिए बहुत समय बचा सकते थे। यहाँ अपने कीमती समय को बचाने के लिए मेरे जैसे नौसिखियों के लिए घटनाओं का क्रम है।

पहले मैंने D: \ Users \ Imre \ AppData \ Local \ Android \ sdk1 \ extras \ google \ play_licensing को फ़ाइल, नए, आयात मॉड्यूल में जाकर "लाइब्रेरी" फ़ोल्डर में आयात करके "लाइब्रेरी" फ़ोल्डर आयात किया। यदि आप एसडीके प्रबंधक खोलते हैं और पॉपअप स्क्रीन के निचले भाग में "लॉन्च स्टैंडअलोन एसडीके प्रबंधक" पर क्लिक करते हैं, तो आप नीचे में "एक्स्ट्रा" फ़ोल्डर के ऊपर अपने पॉइंटर को मँडरा सकते हैं और छोटी पीली जानकारी आपको बताएगी कि आप कहाँ मिलेंगे वह पैकेज जिसे आपको आयात करने की आवश्यकता है।

एक बार जब यह किया जाता है, तो "प्रोजेक्ट" के साथ बाएं फलक में "लाइब्रेरी" अनुभाग पर जाएं और इसके भीतर "एंड्रॉइड" टैब खोलें। लाइब्रेरी का जावा सेक्शन खोलें और एपीके एक्सपेंसेशनपॉलिशी क्लास खोलें। यदि आपके पास त्रुटियां हैं और आयात। "निर्भरता" के अंतर्गत आपके पास "classpath 'com.android.tools.build:gradle:1.5.0" शामिल है। 1.5.0 आपके मामले में भिन्न हो सकता है। मुझे लगता है कि यह आपके स्टूडियो संस्करण पर निर्भर करता है। मेरा 1.5.1 है। यदि आपका नया है, तो आपको संख्याओं को अपडेट करने के लिए याद दिलाया जाएगा।

उसके बाद, "build.gradle (मॉड्यूल: लाइब्रेरी) पर जाएं और" android "अनुभाग में" useLibrary 'org.apache.http.legacy' को शामिल करें। अब सिंक (आर / एच शीर्ष कोने) की पेशकश की जानी चाहिए। कर दो।

यदि आपको और त्रुटि संदेश मिलते हैं (मुझे यह नहीं पता होगा क्योंकि मैंने इसे दूसरे तरीके से किया था), अपाचे फाइलें आपके प्रोजेक्ट से गायब हो सकती हैं, क्योंकि अपाचे अब समर्थित नहीं है। उन्हें C / D में खोजें: उपयोगकर्ता / Yourname / AppData / स्थानीय / Android / Sdk / प्लेटफ़ॉर्म / Android-23 / वैकल्पिक और कॉपी / पेस्ट करके उन्हें अपनेproproject / app / libs फ़ोल्डर में डालें। आपके पास एक वैकल्पिक। Json और एक org.apache.http.legacy.jar फ़ाइल होनी चाहिए। आप अपाचे की वेबसाइट पर जाना और नवीनतम संस्करण dowloading से बेहतर हो सकते हैं: http://hc.apache.org/downloads.cgi इसे कहीं भी खोल दें, इसे खोलें, इसे "काम" पर जाएं, httpclient-4.5.1 की प्रतिलिपि बनाएँ। .jar फ़ाइल और इसके साथ org.apache.http.legacy.jar फ़ाइल बदलें।

अपनी परियोजना को सिंक और पुनर्निर्माण / साफ करें और इसे जाना अच्छा होना चाहिए।

बस मामले में, अपना टर्मिनल खोलें (एल / एच एंड्रॉइड स्टूडियो के नीचे) और "ग्रेडलेव क्लीन" टाइप करें। यह कुछ चीजें स्थापित करेगा। एक बार यह हो जाने के बाद, "gradlew assemble" टाइप करें। इसे समाप्त करने में कुछ मिनट लगेंगे, लेकिन यदि आपके पास कोई कोर्स है तो यह आपको त्रुटियाँ देगा। यदि आप टर्मिनल में कुछ भी नहीं टाइप कर सकते हैं, तो कमांड प्रॉम्प्ट (विंडोज बटन + आर) लॉन्च करें, टाइप करें cmd, हिट ओके, राइट टू द टाइटल ऑफ़ द ब्लैक ब्लैक पॉपअप स्क्रीन (C: \ WINDOWS \ system32 \ cmd.exe) , गुण, विकल्प, खिड़की के नीचे की जाँच करें कि "उपयोग विरासत कंसोल" मोटा है। A.Studio को पुनरारंभ करें।

सौभाग्य!


1

मुझे उपरोक्त पोस्ट में से कोई भी पोस्ट नहीं करना था, मेरे लिए पूरी तरह से काम किया।

मैं एंड्रॉइड स्टूडियो का उपयोग कर रहा हूं

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

compileSdkVersion 23
buildToolsVersion "23.0.3"

चरण 1: नवीनतम अंतिम फ़ाइल डाउनलोड करें ( http://www-eu.apache.org/dist//httpcompenders/httpclient/binary/httpcompenders-client-4.5.2-bin.zip )

चरण 2: कॉपी पेस्ट .jar फ़ाइल को लिबर फोल्डर में बनाएँ (बनाएँ यदि पहले से मौजूद नहीं है) अपने मॉड्यूल में (ऐप या लाइब्रेरी हो सकती है)

चरण 3: जार और "लाइब्रेरी के रूप में जोड़ें" पर राइट क्लिक करें। यह स्वचालित रूप से जार फ़ाइल को आपके मॉड्यूल के gradle फ़ाइल में निर्भरता के रूप में जोड़ देगा

चरण 4: अब स्वचालित रूप से आपकी समस्या का समाधान हो जाएगा, लेकिन यदि आप अपने ऐप में प्रोगार्ड का उपयोग कर रहे हैं, तो यह आपको डुप्लिकेट क्लास फ़ाइलों के बारे में चेतावनी देगा और आपको निर्माण नहीं करने देगा। यह एक ज्ञात बग है और आपको अपने रक्षक नियमों का पालन करना होगा

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

शुभ लाभ!


0

मेरे मामले में, मैंने अपने एंड्रॉइड प्रोजेक्ट में अपनी एक लाइब्रेरी अपडेट की।

मैं अपने कैश संग्रहण समाधान के रूप में जलाशय का उपयोग कर रहा हूं: https://github.com/anupcowkur/Reservoir

मैं इससे चला गया:

compile 'com.anupcowkur:reservoir:2.1'

सेवा:

compile 'com.anupcowkur:reservoir:3.1.0'

लाइब्रेरी लेखक ने कॉमन्स-आईआईओ लाइब्रेरी को रेपो से हटा दिया होगा ताकि मेरा ऐप अब काम न करे।

मुझे मैन्युअल रूप से कमल-आईओ को इस पर जोड़कर शामिल करना था:

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

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


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.