Android M के लिए build.grad को कंपाइल-टाइम डिपेंडेंसी के रूप में Apache HTTP API (विरासत) कैसे जोड़ें?


96

जैसा कि यहाँ बताया गया है , Android M Apache HTTP API का समर्थन नहीं करेगा। डॉक्स स्थिति:

इसके बजाय HttpURLConnection वर्ग का उपयोग करें।

या

अपाचे HTTP एपीआई का उपयोग जारी रखने के लिए, आपको पहले अपनी बिल्ड.gradle फ़ाइल में निम्नलिखित संकलन-समय निर्भरता की घोषणा करनी चाहिए:

android {उपयोग की सीमाएँ 'org.apache.http.legacy'}

मैंने अपनी परियोजना के HttpClient के बहुत से उपयोग को HttpURLConnection में बदल दिया है, हालाँकि, मुझे अभी भी कुछ क्षेत्रों में HttpClient का उपयोग करने की आवश्यकता है। इसलिए, मैं एक संकलन-समय निर्भरता के रूप में 'org.apache.http.legacy' घोषित करने की कोशिश कर रहा हूं, लेकिन build.gradle में त्रुटि हो रही है:

ग्रैड डीएसएल विधि नहीं मिली: 'यूज़लिफ्ट्स ()'

मेरा प्रश्न है: मैं अपनी परियोजना में एक संकलन-समय पर निर्भरता के रूप में 'org.apache.http.legacy' की घोषणा कैसे करूं?

किसी भी प्रकार की मदद की बेहद सराहना की जाती है। धन्यवाद


3
सुनिश्चित करें कि आप एंड्रॉइड प्लगइन के लिए एक हालिया ग्रेड का उपयोग कर रहे हैं। मेरा अनुमान है कि यह वास्तव में नया है, जिसका अर्थ है कि आपको कुछ इस तरह की आवश्यकता होगी 1.3.0-rc2। आप अपाचे के अपने Android- संगत संस्करण HttpClient का उपयोग करने पर भी विचार कर सकते हैं ।
कॉमन्सवेयर

त्वरित प्रतिक्रिया के लिए धन्यवाद @CommonsWare ... क्या आप शीर्ष-स्तरीय बिल्ड.ग्रेड फ़ाइल में "classpath 'com.android.tools.build:gradle:1.0.0" लाइन का उल्लेख कर रहे हैं?
विराट सिंह

1
हाँ। मैं नहीं बल्कि हैरान कर दिया जाएगा तो 1.0.0है useLibraryबात। यह संभव है कि यह 1.3.x से पहले क्रेप हो, इसलिए आप कोशिश कर सकते हैं 1.2.3(AFAIK, नवीनतम उत्पादन रिलीज) और देखें कि क्या होता है।
कॉमन्सवेयर

मैंने सिर्फ '1.2.3' की कोशिश की और कोई किस्मत नहीं - वही त्रुटि -> "ग्रेड डीएसएल विधि नहीं मिली: 'यूज़लिफ्ट्स ()'": /
विराट सिंह

हाँ, चूंकि यह एम डेवलपर पूर्वावलोकन से बंधा हुआ है, इसलिए मैं इससे हैरान नहीं हूं। शायद आपको ज़रूरत है 1.3.0-rc2(या कुछ नया, अगर वहाँ एक है)।
कॉमन्सवेयर

जवाबों:


172

एपीआई 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

नवीनतम एंड्रॉइड ग्रेडल प्लगइन चैंज: http://tools.android.com/tech-docs/new-build-system


2
मैं ग्रेडल बिल्ड वर्जन को अपडेट करता हूं और फिर अपाचे के लिए भी उपयोग की घोषणा करता हूं, लेकिन फिर भी मुझे त्रुटि मिलेगी: त्रुटि: (204, 13) त्रुटि: प्रतीक वर्ग को नहीं पा सकता है DefaultHttpClient त्रुटि: (204, 48) त्रुटि: प्रतीक वर्ग को डिफ़ॉल्ट नहीं कर सकता DefaultHttpClient त्रुटि: (205, 13) त्रुटि: प्रतीक वर्ग HttpPost त्रुटि नहीं ढूँढ सकता: (205, 37) त्रुटि: प्रतीक वर्ग HttpPost त्रुटि नहीं ढूँढ सकता: (207, 13) त्रुटि: प्रतीक वर्ग HttpResponse त्रुटि नहीं ढूँढ सकता: (208, 13) त्रुटि: नहीं कर सकता प्रतीक वर्ग HttpEntity त्रुटि खोजें: (209, 19) त्रुटि: प्रतीक चर नहीं मिल सकता है EntityUtils
Varnit Khandelwal

1
उत्तर से मैं कुछ चूक गया: आपको यह सुनिश्चित करने की आवश्यकता है कि ग्रेडल क्लाथ आपके एप्लिकेशन में शीर्ष स्तर की बिल्ड फ़ाइल में है, जहाँ useLibraryआपके ऐप विशिष्ट बिल्ड फ़ाइल में होना चाहिए।
ग्रीम

उपरोक्त समाधान प्राप्त करने के लिए इस जार फ़ाइल को जोड़ना न भूलें :)
Sheraz Ahmad Khilji

@ शेराज़ की अब आवश्यकता नहीं है - ग्रेडेल बिल्ड इसे स्वचालित रूप से उठाता है
रिचर्ड ले मेसुरियर

1
@ रटुल आपको packagingOptions {}ब्लॉक के अंदर एक ब्लॉक जोड़ना चाहिए android, इस ब्लॉक के अंदर, जोड़ें exclude 'META-INF/LICENSE'... (प्रत्येक पंक्ति प्रति डुप्लिकेट फ़ाइल की सूचना दी)
hidro

28

एक और विकल्प सिर्फ जंबंडल निर्भरता को जोड़ना है। यह अधिक एंड्रॉइड स्टूडियो के अनुकूल है क्योंकि एंड्रॉइड स्टूडियो संदेश नहीं देता है "प्रतीक का समाधान नहीं कर सकता ..."

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

यह mavenCentral () रिपॉजिटरी पर उपलब्ध है।
19

इसे संकलित नहीं किया जा सकता है: त्रुटि: कार्य के लिए निष्पादन विफल रहा ': <प्रोज>: पैकेज <प्रज> डिबग'। > /Users/<user>/Documents/<Proj>/<Activity>/build/intermediates/classes-proguard/<Proj>/debug/classes.jar के हैश गणना करने में असमर्थ
यूरी Chernyshov

क्या आपने बिना किसी रक्षक के संकलन (पुनर्निर्माण) का प्रयास किया है?
nexDev

क्या आप कृपया एक नमूना परियोजना दिखा सकते हैं जो इसके साथ काम करती है? अब मुझे यह त्रुटि मिल रही है: त्रुटि: कार्य के लिए निष्पादन विफल रहा ': ऐप: packageAllSyncmeappDebugClassesForMultiDex'। > java.util.zip.ZipException: डुप्लिकेट प्रविष्टि: org / apache / http / एनोटेशन / GuardedBy.class
Android डेवलपर

खैर, आपके द्वारा की गई त्रुटि का प्रकार आपकी परियोजना के लिए विशिष्ट है। आपके पास अपाचे पैकेज डुप्लिकेट हैं। एक स्पष्ट रूप से org.jbundle में। .... और दूसरा आपके किसी पुस्तकालय में। मैं डुप्लीकेट पैकेज की तलाश में हूँ:
nexDev


13

अपनी build.gradle फ़ाइल में >> नोट्स के अनुसार यूज़लवर्क 'org.apache.http.legacy' जोड़ें ।Android 6.0 ChangesApache 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'
}

निर्भरता में 'प्रदान' का उपयोग करते हुए एपीके में शामिल नहीं किया जाएगा


11

: बस फ़ाइल की प्रतिलिपि org.apache.http.legacy.jarसे Android/Sdk/platforms/android-23/optionalपरियोजना फ़ोल्डर में फ़ोल्डर app/libs

23.1.1 के लिए आकर्षण की तरह काम किया।


2

मैंने इस समस्या को इस तरह हल किया:

1.) GUG के रूप में उच्च स्तरीय बिल्ड फ़ाइल में classpath सेट करें:

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

जैसा कि उत्तर थोड़े पुराने हैं, मैं अपना समाधान (मेरे लिए क्या काम करता है) डालूंगा, यह किसी और के लिए उपयोगी हो सकता है ... मैंने अपना समाधान अपाचे के आधिकारिक दस्तावेज से लिया , कोई काम नहीं किया।

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

या इसके बजाय संकलित करें बशर्ते दोनों काम होंगे
लॉगेश्वरन

ऊपर विन्यास के साथ, मैं त्रुटि के साथ मिला: (155, 0) ग्रेड डीएसएल विधि नहीं मिली: 'प्रदान ()'
RoFF

1

एफडब्ल्यूआईडब्ल्यू ने अपाचे पुस्तकालय को हटाने से कुछ समय पहले पूर्वाभास किया था। हमारे अच्छे दोस्त जेसी विल्सन ने हमें 2011 में एक सुराग दिया: http://android-developers.blogspot.com/2011/09/androids-http-clients.html

Google ने कुछ समय पहले ApacheHTTPClient पर काम करना बंद कर दिया था, इसलिए कोई भी लाइब्रेरी जो अब भी उस पर निर्भर है, को हटाए गए पुस्तकालयों की सूची में रखा जाना चाहिए जब तक कि अनुचर अपने कोड को अपडेट नहीं करते।

<rant> मैं आपको नहीं बता सकता कि अपाचे HTTP क्लाइंट के साथ जुड़ने पर ज़ोर देने वाले लोगों के साथ मेरे पास कितने तकनीकी तर्क हैं। कुछ प्रमुख ऐप हैं जो टूटने वाले हैं क्योंकि मेरे गैर-नामित पिछले नियोक्ताओं के प्रबंधन ने अपने शीर्ष इंजीनियरों की बात नहीं सुनी या उन्हें पता नहीं था कि वे क्या बात कर रहे थे जब उन्होंने चेतावनी को नजरअंदाज कर दिया था ... लेकिन, पानी के नीचे पुल।

मैं जीता।

</rant>


1
मेरी समझ यह है कि Apache HttpClient एंड्रॉइड -23 में छिपा हुआ है लेकिन वास्तव में हटाया नहीं गया है। हटाने से पहले के प्लेटफार्मों को लक्षित करने वाले बहुत सारे मौजूदा ग्राहक टूट जाएंगे, जहां HttpClient छिपा नहीं है, और ये मौजूदा ऐप अभी भी एंड्रॉइड -23 पर चलने की उम्मीद है। एंड्रॉइड -23 पर, यूज़लैट को जोड़ने से इन विरासत कक्षाओं को बूट क्लासपाथ में जोड़ने का काम करता है, अर्थात, उन कक्षाओं की सूची में, जिन्हें मंच द्वारा आपूर्ति की जाती है। यह अनिवार्य रूप से एंड्रॉइड -23 पर कक्षाओं को अनहाइड करता है।
जो बोबीर

जब एक वर्ग को पदावनत किया जाता है तो इसे आगे बढ़ने से रोकने के लिए पहले इसे छिपाना आम है। फिर समय निकलते ही इसे हटाया जा सकता है। कुछ इस तरह से: 1. वर्तमान संस्करण में पदावनत के रूप में चिह्नित करें। 2. दूसरे संस्करण में छिपाएं। 3. पुरानी कक्षा को पूरी तरह से खत्म करने के लिए सभी कोड को रिफलेक्टर करें।
कोडर रोडी

0

समस्याओं को हल करने के लिए सुनिश्चित करें कि आप बिल्ड टूल्स वर्जन "23.0.0 rc2" का उपयोग कर रहे हैं, निम्नलिखित टूल्स के साथ ग्रेडल निर्भरता का निर्माण करें:

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