วิธีเพิ่ม Apache HTTP API (เดิม) เป็น compile-time dependency เพื่อ build.grade สำหรับ Android M


97

ดังที่ได้กล่าวไว้ที่นี่ Android M จะไม่รองรับ Apache HTTP API สถานะเอกสารเป็น:

ใช้คลาส HttpURLConnection แทน

หรือ

ในการใช้ Apache HTTP API ต่อไปคุณต้องประกาศการพึ่งพาเวลาคอมไพล์ต่อไปนี้ในไฟล์ build.gradle ของคุณก่อน:

แอนดรอยด์ {useLibrary 'org.apache.http.legacy'}

ฉันได้แปลงการใช้งาน HttpClient ของโครงการเป็น HttpURLConnection แล้วอย่างไรก็ตามฉันยังต้องใช้ HttpClient ในบางพื้นที่ ดังนั้นฉันพยายามประกาศ 'org.apache.http.legacy' เป็นการพึ่งพาเวลาคอมไพล์ แต่ได้รับข้อผิดพลาดใน build.gradle:

ไม่พบวิธี Gradle DSL: 'useLibrary ()'

คำถามของฉันคือ: ฉันจะประกาศ 'org.apache.http.legacy' เป็นการอ้างอิงเวลาคอมไพล์ในโครงการของฉันได้อย่างไร

ความช่วยเหลือใด ๆ ที่ชื่นชมมาก ขอบคุณ


3
ตรวจสอบให้แน่ใจว่าคุณกำลังใช้ปลั๊กอิน Gradle for Android ที่ค่อนข้างใหม่ ฉันเดาว่านี่เป็นเรื่องใหม่จริงๆหมายความว่าคุณต้องมีอะไรแบบ1.3.0-rc2นี้ นอกจากนี้คุณยังอาจพิจารณาใช้รุ่น Android ที่เข้ากันได้ของ Apache ตัวเองของ HttpClient
CommonsWare

ขอบคุณสำหรับการตอบกลับอย่างรวดเร็ว @CommonsWare ... คุณหมายถึงบรรทัด "classpath" com.android.tools.build:gradle:1.0.0 "" ในไฟล์ build.gradle ระดับบนสุดหรือไม่
Virat Singh

1
ใช่. ฉันจะค่อนข้างแปลกใจถ้า1.0.0มีuseLibraryสิ่งนั้น เป็นไปได้ว่ามันพุ่งเข้ามาก่อน 1.3.x ดังนั้นคุณสามารถลอง1.2.3(AFAIK ซึ่งเป็นรุ่นที่ผลิตล่าสุด) และดูว่าเกิดอะไรขึ้น
CommonsWare

ฉันเพิ่งลอง '1.2.3' และไม่มีโชค - ข้อผิดพลาดเดียวกัน -> "ไม่พบวิธี Gradle DSL: 'useLibrary ()'": /
Virat Singh

ใช่เนื่องจากสิ่งนี้เชื่อมโยงกับ M Developer Preview ฉันจึงไม่ตกใจกับสิ่งนั้น คุณอาจต้องการ1.3.0-rc2(หรือสิ่งที่ใหม่กว่าถ้ามี)
CommonsWare

คำตอบ:


173

สำหรับ 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: (204, 48) ข้อผิดพลาด: ไม่พบคลาสสัญลักษณ์ข้อผิดพลาด DefaultHttpClient: ข้อผิดพลาด (205, 13): ไม่พบคลาสสัญลักษณ์ข้อผิดพลาด HttpPost: (205, 37) ข้อผิดพลาด: ไม่พบคลาสสัญลักษณ์ข้อผิดพลาด HttpPost: ข้อผิดพลาด (207, 13): ไม่พบคลาสสัญลักษณ์ข้อผิดพลาด HttpResponse: (208, 13) ข้อผิดพลาด: ไม่สามารถ ค้นหาคลาสสัญลักษณ์ข้อผิดพลาด HttpEntity: (209, 19) ข้อผิดพลาด: ไม่พบตัวแปรสัญลักษณ์ EntityUtils
Varnit Khandelwal

1
สิ่งที่ฉันพลาดไปจากคำตอบ: คุณต้องตรวจสอบให้แน่ใจว่า classpath ของ gradle อยู่ในไฟล์บิวด์ระดับบนสุดของแอปซึ่งuseLibraryต้องอยู่ในไฟล์บิลด์เฉพาะของแอป
Graeme

อย่าลืมเพิ่มไฟล์jarนี้เพื่อให้โซลูชันข้างต้นใช้งานได้ :)
Sheraz Ahmad Khilji

@ Sheraz ที่ไม่จำเป็นอีกต่อไป - การสร้าง gradle จะหยิบมันขึ้นมาโดยอัตโนมัติ
Richard Le Mesurier

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>: package <Proj> Debug' > ไม่สามารถคำนวณแฮชของ /Users/<user>/Documents/<Proj>/<Activity>/build/intermediates/classes-proguard/<Proj>/debug/classes.jar
Yuriy Chernyshov

คุณได้ลองคอมไพล์ (สร้างใหม่) โดยไม่ใช้โปรการ์ดแล้วหรือยัง?
nexDev

คุณช่วยแสดงโครงการตัวอย่างที่ใช้ได้กับสิ่งนี้ได้ไหม ตอนนี้ฉันได้รับข้อผิดพลาดนี้: Error: Execution failed for task ': app: packageAllSyncmeappDebugClassesForMultiDex' > java.util.zip.ZipException: รายการที่ซ้ำกัน: org / apache / http / annotation / GuardedBy.class
นักพัฒนา Android

ประเภทของข้อผิดพลาดที่คุณดูเหมือนเฉพาะสำหรับโครงการของคุณ คุณมีแพ็กเกจ 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/optionalapp/libs

ทำงานอย่างมีเสน่ห์สำหรับ 23.1.1


2

ฉันแก้ไขปัญหานี้ดังนี้:

1. ) ตั้งค่า classpath ในไฟล์ build ระดับบนสุดตามที่ 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 / ใน gradle:

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: 'ให้ ()'
RoFF

1

FWIW การลบไลบรารี Apache ถูกคาดการณ์ไว้ก่อนหน้านี้ เพื่อนที่ดีของเรา Jesse Wilson ให้เบาะแสย้อนกลับไปในปี 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 จะทำหน้าที่ในการผนวกคลาสดั้งเดิมเหล่านี้เข้ากับ boot classpath นั่นคือเข้ากับรายการคลาสที่จัดหาโดยแพลตฟอร์ม สิ่งนี้จะยกเลิกการซ่อนคลาสใน android-23 เป็นหลัก
Joe Bowbeer

เมื่อชั้นเรียนเลิกใช้งานเป็นเรื่องปกติที่จะต้องซ่อนไว้ก่อนเพื่อป้องกันไม่ให้มีการใช้งานต่อไป จากนั้นสามารถถอดออกได้เมื่อเวลาผ่านไป สิ่งที่ต้องการ: 1. ทำเครื่องหมายว่าเลิกใช้แล้วในเวอร์ชันปัจจุบัน 2. ซ่อนในเวอร์ชันที่สอง 3. refactor รหัสทั้งหมดเพื่อกำจัดคลาสเก่าอย่างสมบูรณ์
Coder Roadie

0

ในการแก้ไขปัญหาตรวจสอบให้แน่ใจว่าคุณกำลังใช้ build tools เวอร์ชัน "23.0.0 rc2" ด้วยเครื่องมือต่อไปนี้ build gradle dependency:

classpath 'com.android.tools.build:gradle:1.3.0-beta2'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.