Android Gradle Apache httpClient không tồn tại?


263

Tôi đang cố gắng chuyển đổi một dự án IntelliJ sang hệ thống Gradle của Android Studio nhưng tôi đang gặp lỗi với Apache HttpClient? Tôi có thiếu thứ gì không, các lỗi tôi gặp phải như sau:

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

Tệp build.gradle của tôi có các phụ thuộc sau:

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

Có vẻ như nhiều người đang gặp phải một vấn đề tương tự nhưng cả SO và Google đều không có giải pháp nên tôi hy vọng câu hỏi này sẽ giúp ích cho những người tìm kiếm trong tương lai.

Câu trả lời:


39

Tôi đề nghị bạn thay thế apache apache không dùng nữa bằng kết nối httpURLC mới.

Đó là một giải pháp sạch hơn, khá dễ dàng để di chuyển và nói chung là tốt hơn để theo kịp các thay đổi SDK mới nhất hơn là cố gắng hack / patch / cách khắc phục: bạn thường hối hận về sau :)

Bước 1

HttpGet httpGet = new HttpGet(url);

trở thành:

URL urlObj = new URL(url);

Bước 2

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

trở thành:

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

Bước 2 bis

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

trở thành:

int status = urlConnection.getResponseCode();

Xin chào @Benjamin, làm cách nào để gửi URL bằng phương thức PUT?
Dharma Sai Seerapu

@TrickySolutions Xin lỗi, không biết, chưa sử dụng phương pháp PUT.
Benjamin Piette

521

nếu bạn đang sử dụng sdk đích như 23, hãy thêm mã bên dưới vào build.gradle của bạn

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

và thay đổi bản dựng của bạn thành

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

để biết thêm thông tin theo liên kết này


7
thay đổi bản dựng của bạn thành classpath 'com.android.tools.build:gradle:1.3.0'
Jinu

3
Đã có 1.3.1. Vẫn không thể giải quyết các lớp trong Android Studio:Error:(14, 23) error: package org.apache.http does not exist
Henrique de Sousa

2
studio android 1.4 beta 2
Jinu

2
Và nếu bạn muốn sử dụng phiên bản mới nhất của các thành phần apache http thì sao?
russellhoff

2
Thanx Jinu, cập nhật Android Studio từ phiên bản 1.3 lên phiên bản trên là bắt buộc. Làm cho nó hoạt động
mithil1501

94

Tôi đã có vấn đề này và sau đó tìm thấy các trang này: Ở đây bạn có thể thấy rằng thư viện apache bị phản đối, nhưng nó không bị xóa, vì vậy nó sẽ hoạt động. Nó không.

Xem .

Và ở đây bạn có thể thấy cách đưa thư viện apache vào dự án của bạn

Xem .

Tôi đã giải quyết vấn đề bằng cách thêm sau vào tệp build.gradle của mình như được đề xuất trong liên kết thứ hai.

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

Tuy nhiên, điều này chỉ hoạt động nếu bạn đang sử dụng gradle 1.3.0-beta2 hoặc cao hơn, vì vậy bạn sẽ phải thêm phần này vào phần phụ thuộc bản dựng nếu bạn ở phiên bản thấp hơn:

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

Hi vọng điêu nay co ich.


Đối với tôi, nó không thành công với: Lỗi: Thực thi không thành công cho nhiệm vụ ': xenoAmp: mergeDebugJavaResource'. > Không thể xác định thư mục mở rộng cho L: \ Projekty \ xenoampgit \ xenoAmp \ build \ trung gian \ packJarsJavaResource \ debug \ httpclient-android-4.3.5.1.jar1037172435 \ META-INF \ LICENSE với các thư mục L: \ trung gian \ sourceFolderJavaResource \ debug, L: \ Projekty \ xenoampgit \ xenoAmp \ build \ trung gian \
packJarsJavaResource

@ssuukk Xin chào, bạn đã tìm ra giải pháp cho lỗi này chưa?
CeccoCQ

2
Thật không may, giải pháp là thay đổi mục tiêu thành API cao nhất hiện tại và điều đó đã phá vỡ RẤT NHIỀU thứ! Sau đó, tôi đã phải thêm "useL Library", "classpath" PLUS tham chiếu apache lib, như được mô tả ở nơi khác trong câu hỏi này. Và sau khi có thể biên dịch lại được, tôi quyết định bỏ hoàn toàn mã Apache và thay thế tất cả bằng URLConnection, điều này dễ hơn tôi nghĩ.
ssuukk

Đồng ý với ssuukk. Không có câu trả lời nào trong số này làm việc cho tôi vì vậy cuối cùng tôi cũng thoát khỏi các thư viện Apache. Tôi khá mới để phát triển Android nhưng nó rất đơn giản.
John81

Tôi cũng gặp vấn đề tương tự và tôi đã khắc phục bằng cách sử dụng thư viện 'org.apache.http.legacy' của Milos ... tuy nhiên đối với @ssuukk với vấn đề của bạn, bạn có thể thử thêm vấn đề này luôn: android {packOptions {loại trừ 'META-INF / LICENSE 'loại trừ' META-INF / DEPENDENCIES 'loại trừ' META-INF / THÔNG BÁO 'loại trừ' META-INF / NOTICE.txt 'loại trừ' META-INF / MANIFEST '}}
Alexiscanny

53

Thêm thư viện này vào build.gradle

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

ai đó có thể giải thích điều này? Tại sao điều này làm cho nó hoạt động? Tại sao chúng ta cần thêm dòng này, ngoài việc thêm các phụ thuộc?
Dan

2
@Dan đó là vì thư viện org.apache.http đã bị xóa với phiên bản 23.
eltiare 04/07/18

Để làm rõ, điều này không đi vào build.gradlethư mục gốc , mà là trong thư mục mô-đun bạn đang xây dựng (tức là "ứng dụng")
hamx0r

37

sao chép org.apache.http.legacy.jartrong Android/Sdk/platforms/android-23/optionalthư mục vàoapp/libs

và cũng đã thêm dòng này vào tập tin app.gradle

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

Nhưng nếu bạn đang sử dụng nhiều thư viện jar hơn, bạn có thể sử dụng cách này

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

2
Trong một dự án khác của tôi, đây là câu trả lời duy nhất có hiệu quả +1 và cảm ơn.
Apqu

Tại sao đây không phải là câu trả lời?
dibble

1
Tương tự cho tôi. Ai đó nên chấp nhận câu trả lời này thay vì câu trả lời ngay bây giờ.
Ivan Fazaniuk

Đây là con đường kháng chiến ít nhất, không chắc chắn tôi muốn xuống lớp. Nó biên dịch tốt cho tôi.
Ed Manners

Cảm ơn! Điều này hoạt động với plugin 0.6.0-alpha5 thử nghiệm. "useL Library" dường như không tồn tại trong plugin thử nghiệm.
khỉ0506

14

Về cơ bản tất cả những gì bạn cần làm là thêm:

useLibrary  'org.apache.http.legacy'

Để build.gradletập tin của bạn .


9

Tôi gặp vấn đề tương tự. Câu trả lời của Daniel Nugent đã giúp một chút (sau khi làm theo lời khuyên của anh ta HttpResponseđã được tìm thấy - nhưng HttpClientvẫn còn thiếu).

Vì vậy, đây là những gì đã sửa nó cho tôi:

  1. (nếu chưa được thực hiện, hãy khen ngợi các báo cáo nhập khẩu trước đó)
  2. truy cập http://hc.apache.org/doads.cgi
  3. lấy 4.5.1.ziptừ phần nhị phân
  4. giải nén nó và dán httpcore-4.4.3& httpclient-4.5.1.jartrong project/libsthư mục
  5. bấm chuột phải vào bình và chọn Thêm làm thư viện .

Hy vọng nó giúp.


9

Tôi gặp vấn đề tương tự, bạn có thể làm cho nó hoạt động bằng một phương pháp tương tự.

Trước tiên, hãy thử điều này với cấu hình hiện tại của bạn, loại trừ httpclientkhỏi 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'
} 

Trong trường hợp của tôi, tôi đã sửa nó bằng cách sử dụng các lọ sau:

Sau đó, trong build.gradle, ngoại trừ httpclienttừ 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'
}

Cảm ơn câu trả lời của bạn, tôi sợ không làm việc cho tôi mặc dù :(
Apqu

@tur thật lạ, tùy chọn thứ hai làm việc cho tôi. Đảm bảo rằng các tệp jar cũ của bạn bị xóa cho tùy chọn thứ hai.
Daniel Nugent

Để làm gì libs/core.jar?
IgorGanapolsky

7

Câu trả lời hoàn hảo của Jinu và Daniel

Thêm vào điều này tôi đã giải quyết vấn đề bằng cách sử dụng Điều này, nếu compileSdkVersion của bạn là 19 (TRONG TRƯỜNG HỢP CỦA TÔI)

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'

khác nếu compileSdkVersion của bạn là 23 thì hãy sử dụng

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

Đây là những gì tôi đã làm, và nó làm việc cho tôi.

Bước 1: thêm phần này vào build.THER (mô-đun: ứng dụng)

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

Bước 2: đồng bộ hóa dự án và thực hiện.


Bất kỳ lý do cho bỏ phiếu xuống?
NOT_A_PROGRAMmer

nó không thể giải quyết với lỗi "Không thể giải quyết: org.jbundle.util.osgi.wrapping: org.jbundle.util.osgi.wrapping.org.apache.http.cli‌ ent: 4.1.2". Tôi đang sử dụng lớp thử nghiệm 0.6.0-beta. bạn có thể hình dung về nó ?
RoFF 3/03/2016

1

Phiên bản máy khách HTTP Apache được cung cấp trên Android đã rất cũ .

Google Android 1.0 đã được phát hành với ảnh chụp nhanh BETA của Apache httpClient. Để trùng khớp với bản phát hành Android đầu tiên, API API HTTPClient 4.0 phải bị đóng băng sớm, trong khi nhiều giao diện và cấu trúc bên trong vẫn chưa hoàn thành. Khi Apache httpClient 4.0 đang hoàn thiện, dự án đã mong đợi Google kết hợp các cải tiến mã mới nhất vào cây mã của họ. Thật không may, nó đã không xảy ra.

Mặc dù bạn có thể tiếp tục sử dụng thư viện không dùng nữa qua useLibrary 'org.apache.http.legacy'cách giải quyết (được đề xuất bởi @Jinu và những người khác), bạn thực sự cần phải cắn viên đạn và cập nhật lên một thứ khác, ví dụ như Android gốc HttpUrlConnection, hoặc nếu điều đó không đáp ứng nhu cầu của bạn, bạn có thể sử dụng thư viện OkHttp , đây là những gì HttpUrlConnectionđược dựa trên nội bộ .

OkHttp thực sự có một lớp tương thích sử dụng cùng API với máy khách Apache, mặc dù chúng không triển khai tất cả các tính năng giống nhau, vì vậy số dặm của bạn có thể thay đổi.

Mặc dù có thể nhập phiên bản mới hơn của máy khách Apache (như được đề xuất bởi @MartinPfeffer), nhưng có khả năng hầu hết các lớp và phương thức bạn đang sử dụng trước đây đều bị phản đối và có một rủi ro khá lớn là việc cập nhật sẽ gây ra lỗi trong mã của bạn (ví dụ tôi đã tìm thấy một số kết nối trước đây hoạt động từ phía sau proxy không còn hoạt động nữa), vì vậy đây không phải là một giải pháp tuyệt vời.


1

Sau khi dành nhiều ngày cho chủ đề này, tôi đã giải quyết nó cuối cùng. Thật không may, chúng tôi cần nó nếu chúng tôi muốn sử dụng các tập tin mở rộng. Giải pháp đã được cung cấp bởi một vài người ở đây, nhưng đối với tôi, câu trả lời bị thiếu một vài chi tiết nhỏ có thể giúp tôi tiết kiệm rất nhiều thời gian. Dưới đây là chuỗi các sự kiện cho người mới như tôi để tiết kiệm thời gian quý báu của bạn.

Đầu tiên tôi nhập thư mục "thư viện" từ D: \ Users \ Imre \ AppData \ Local \ Android \ sdk1 \ extend \ google \ play_licensing vào dự án bằng cách vào Tệp, Mới, Mô-đun nhập và điều hướng đến thư mục "thư viện". Nếu bạn mở Trình quản lý SDK và nhấp vào "Khởi chạy Trình quản lý SDK độc lập" ở cuối màn hình bật lên, bạn có thể di con trỏ qua thư mục "Extras" ở phía dưới và thông tin nhỏ màu vàng sẽ cho bạn biết nơi bạn sẽ tìm thấy gói mà bạn cần nhập.

Khi đã xong, đi xuống phần "thư viện" trong khung bên trái với "Dự án" và trong đó tab "Android" mở. Mở phần java của thư viện và mở lớp APKExpansionPolicy. Nếu bạn có lỗi và nhập org.apache.http.NameValuePair và nhập org.apache.http.client.utils.URLEncodingUtils có màu xám nhạt, hãy mở build.gradle (Project: anything) và đảm bảo rằng trong "buildscript" trong "phụ thuộc", bạn có "classpath 'com.android.tools.build:gradle:1.5.0". 1.5.0 có thể khác trong trường hợp của bạn. Tôi đoán nó phụ thuộc vào phiên bản Studio của bạn. Của tôi là 1,5,1. Nếu bạn là người mới hơn, bạn sẽ được nhắc nhở cập nhật số.

Sau đó, đi đến "build.gradle (Module: library) và đưa" useL Library 'org.apache.http.legacy' vào phần "android". Đồng bộ hóa ngay bây giờ (góc trên cùng R / H) nên được cung cấp. Làm đi.

Nếu bạn nhận được thêm thông báo lỗi (tôi sẽ không biết điều đó vì tôi đã làm theo cách khác), các tệp Apache có thể bị thiếu trong dự án của bạn, vì apache không còn được hỗ trợ nữa. Tìm chúng trong C / D: Người dùng / Yourname / AppData / Local / Android / Sdk / platform / android-23 / tùy chọn và sao chép / dán chúng vào thư mục yourproject / app / libs. Bạn nên có một tệp tùy chọn.json và tệp org.apache.http.legacy.jar trong đó. Bạn có thể tốt hơn nên truy cập trang web của apache và tải xuống phiên bản mới nhất: http://hc.apache.org/doads.cgi Giải nén nó bất cứ nơi nào bạn muốn, mở nó, đi đến "lib", sao chép httpclient-4.5.1 tệp .jar và thay thế tệp org.apache.http.legacy.jar bằng tệp đó.

Đồng bộ hóa và xây dựng lại / làm sạch dự án của bạn và nó sẽ tốt để đi.

Chỉ trong trường hợp, hãy mở thiết bị đầu cuối của bạn (đáy L / H của Android Studio) và nhập "gradlew clean". Nó sẽ cài đặt một vài thứ. Sau khi hoàn thành, gõ "gradlew lắp ráp". Sẽ mất vài phút để hoàn thành, nhưng nó sẽ cung cấp cho bạn các lỗi nếu bạn có bất kỳ khóa học nào. Nếu bạn không thể nhập bất cứ thứ gì vào Terminal, hãy khởi chạy dấu nhắc lệnh (nút Windows + R), nhập cmd, nhấn OK, nhấp chuột phải vào tiêu đề của màn hình bật lên nhỏ màu đen (C: \ WINDOWS \ system32 \ cmd.exe) , Thuộc tính, Tùy chọn, ở dưới cùng của cửa sổ kiểm tra xem "Sử dụng bảng điều khiển cũ" có dày không. Khởi động lại A.Studio.

Chúc may mắn!


1

Tôi đã phải đăng bài vì không có câu trả lời nào ở trên hoàn toàn phù hợp với tôi.

Tôi đang sử dụng Android Studio

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

compileSdkVersion 23
buildToolsVersion "23.0.3"

Bước 1: Tải xuống tệp jar mới nhất ( http://www-eu.apache.org/dist//httpcomponents/httpclient/binary/httpcomponents-client-4.5.2-bin.zip )

Bước 2: Sao chép dán tệp .jar vào thư mục libs (tạo nếu chưa tồn tại) trong mô-đun của bạn (có thể là ứng dụng hoặc thư viện)

Bước 3: Nhấp chuột phải vào bình và "Thêm dưới dạng thư viện". Nó sẽ tự động thêm tệp jar dưới dạng phụ thuộc trong tệp lớp của mô-đun của bạn

Bước 4: Bây giờ tự động vấn đề của bạn sẽ được giải quyết nhưng trong trường hợp bạn đang sử dụng proguard trong ứng dụng của mình, nó sẽ đưa ra cảnh báo về các tệp lớp trùng lặp và sẽ không cho phép bạn xây dựng. Đây là một lỗi đã biết và bạn cần thêm theo quy tắc proguard của mình

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

Chúc may mắn!


0

Trong trường hợp của tôi, tôi đã cập nhật một trong những thư viện của mình trong dự án Android.

Tôi đang sử dụng Reservoir làm giải pháp lưu trữ bộ nhớ cache của mình: https://github.com/anupcowkur/Reservoir

Tôi đã đi từ:

compile 'com.anupcowkur:reservoir:2.1'

Đến:

compile 'com.anupcowkur:reservoir:3.1.0'

Tác giả thư viện phải xóa thư viện commons-io khỏi repo để ứng dụng của tôi không còn hoạt động.

Tôi đã phải tự bao gồm commons-io bằng cách thêm cái này vào gradle:

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

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


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.