Android Gradle Apache HttpClient가 존재하지 않습니까?


263

IntelliJ 프로젝트를 Android Studio의 Gradle 시스템으로 변환하려고하는데 Apache HttpClient에서 오류가 발생합니까? 내가 잃어버린 것, 내가받는 오류는 다음과 같습니다.

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

많은 사람들이 비슷한 문제를 겪고있는 것처럼 보이지만 SO 또는 Google 모두 해결책이 없으므로이 질문이 미래의 검색 자에게 도움이되기를 바랍니다.

답변:


39

더 이상 사용되지 않는 Apache HttpClient를 새 HttpURLConnection으로 바꾸는 것이 좋습니다.

그것은 더 깨끗한 솔루션이며 마이그레이션하기가 쉽고 일반적으로 해킹 / 패치 / 해결 방법을 시도하는 것보다 최신 SDK 변경 사항을 따르는 것이 좋습니다. 일반적으로 나중에 후회합니다 :)

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을 보내는 방법은 무엇입니까?
Dharma Sai Seerapu

@TrickySolutions 죄송 합니다만, 아직 PUT 방법을 사용하지 않았습니다.
Benjamin Piette

521

target sdk를 23으로 사용하는 경우 build.gradle에 아래 코드를 추가하십시오.

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'으로 변경
Jinu

3
이미 1.3.1이있었습니다. 여전히 Android Studio 내부의 클래스를 확인할 수 없습니다.Error:(14, 23) error: package org.apache.http does not exist
Henrique de Sousa

2
Android Studio 1.4 베타 2
Jinu

2
최신 버전의 아파치 http 구성 요소를 사용하려면 어떻게해야합니까?
russellhoff

2
Thanx Jinu, Android Studio를 1.3에서 위 버전으로 업데이트해야합니다. 작동했습니다
mithil1501

94

이 문제가 발생하여 다음 페이지를 찾았습니다. 여기서 아파치 라이브러리가 더 이상 사용되지 않지만 제거되지 않았으므로 작동해야합니다. 그렇지 않습니다.

참조하십시오 .

여기에서 프로젝트에 아파치 라이브러리를 포함시키는 방법을 볼 수 있습니다

참조하십시오 .

두 번째 링크에서 권장하는대로 build.gradle 파일에 다음을 추가하여 문제를 해결했습니다.

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

그러나 gradle 1.3.0-beta2 이상을 사용하는 경우에만 작동하므로 하위 버전 인 경우 빌드 스크립트 종속성에 추가해야합니다.

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

도움이 되었기를 바랍니다.


나를 위해 실패했습니다 : 오류 : 작업 ': xenoAmp : mergeDebugJavaResources'에 대해 실행하지 못했습니다. > L : \ Projekty \ xenoampgit \ xenoAmp \ build 폴더가있는 L : \ Projekty \ xenoampgit \ xenoAmp \ build \ intermediates \ packagedJarsJavaResources \ debug \ httpclient-android-4.3.5.1.jar1037172435 \ META-INF \ LICENSE의 확장 폴더를 결정할 수 없습니다. \ intermediates \ sourceFolderJavaResources \ debug, L : \ Projekty \ xenoampgit \ xenoAmp \ build \ intermediates \ packagedJarsJavaResources \ debug
ssuukk

@ssuukk 안녕하세요,이 오류에 대한 해결책을 찾았습니까?
CeccoCQ

2
불행히도 솔루션은 대상을 현재 가장 높은 API로 변경하는 것이 었습니다. 그런 다음이 질문의 다른 부분에서 설명한대로 "useLibrary", "classpath"PLUS 참조 레거시 아파치 라이브러리를 추가해야했습니다. 그리고 다시 컴파일 할 수 있었을 때 Apache 코드를 모두 버리고 URLConnection으로 대체하기로 결정했습니다.
ssuukk

suukk에 동의하십시오. 이 답변 중 어느 것도 나를 위해 일하지 않았으므로 Apache 라이브러리도 제거했습니다. 나는 안드로이드 개발에 익숙하지 않지만 간단했습니다.
John81

나는 같은 문제가 있었고 Milos가 말한 useLibrary 'org.apache.http.legacy'로 고쳤지만 문제가있는 @ssuukk의 경우 항상 이것을 추가 할 수 있습니다 : android {packagingOptions {exclude 'META-INF / LICENSE ''META-INF / DEPENDENCIES '제외'META-INF / NOTICE '제외'META-INF / NOTICE.txt '제외'META-INF / MANIFEST '제외}}
Alexiscanny

53

이 라이브러리를 build.gradle

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

누군가 이것을 설명 할 수 있습니까? 왜 이것이 작동합니까? 의존성을 추가하는 것 외에 왜이 행을 추가해야합니까?
Dan

2
@Dan

명확히하기 위해, 이것은 루트로 들어 가지 build.gradle않고 오히려 당신이 만들고있는 모듈 폴더 안에 있습니다 (예 : "app")
hamx0r

37

사본 org.apache.http.legacy.jarAndroid/Sdk/platforms/android-23/optional폴더에app/libs

이 줄을 app.gradle 파일에 추가했습니다.

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

그러나 더 많은 jar 라이브러리를 사용하는 경우이 방법을 사용할 수 있습니다

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

2
내 프로젝트 중 다른 프로젝트에서 이것은 +1하고 감사 한 유일한 답변이었습니다.
Apqu

왜 이것이 답이 아닌가?
dibble dec

1
저도 마찬가지입니다. 누군가 지금이 대답을 받아 들여야합니다.
Ivan Fazaniuk

이것은 저항의 가장 작은 길입니다. 그라들을 다운 그레이드하고 싶지는 않습니다. 그것은 나를 위해 잘 컴파일됩니다.
Ed Manners

감사! 이것은 gradle-experimental 0.6.0-alpha5 플러그인과 함께 작동합니다. 실험용 플러그인에는 "useLibrary"가없는 것 같습니다.
monkey0506

14

기본적으로 추가해야 할 것은 다음과 같습니다.

useLibrary  'org.apache.http.legacy'

당신에 build.gradle파일.


9

나는 같은 문제에 부딪쳤다. Daniel Nugent의 답변은 약간의 도움이되었습니다 (자신의 조언 HttpResponse을 찾은 HttpClient후에도 여전히 누락되었습니다).

그래서 여기 나를 위해 고쳐진 것이 있습니다 :

  1. (아직 완료하지 않은 경우 이전의 수입 명세서를 칭찬하십시오)
  2. http://hc.apache.org/downloads.cgi를 방문하십시오 .
  3. 4.5.1.zip이진 섹션에서 가져옵니다
  4. 압축을 풀고 및 붙여 넣기 httpcore-4.4.3& httpclient-4.5.1.jarproject/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'
}

답변 주셔서 감사합니다, 저를 위해 걱정도했다 메신저하지만 :(
Apqu

@tur는 이상합니다. 두 번째 옵션이 저에게 효과적이었습니다. 두 번째 옵션에 대해 이전 jar 파일이 삭제되었는지 확인하십시오.
Daniel Nugent

무엇입니까 libs/core.jar?
IgorGanapolsky

7

Jinu와 Daniel의 완벽한 답변

compileSdkVersion이 19 (IN MY CASE) 인 경우 이것을 사용하여 문제를 해결했습니다.

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.grade (module : app)에 추가

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‌--ent : 4.1.2"오류로 해결하지 못했습니다. 실험용 gradle 0.6.0-beta를 사용하고 있습니다. 알아낼 수 있습니까?
RoFF

1

재고 안드로이드에 제공되는 아파치 HTTP 클라이언트의 버전은 매우 오래되었습니다 .

Google Android 1.0은 Apache HttpClient의 베타 이전 스냅 샷과 함께 출시되었습니다. 첫 번째 Android 릴리스와 일치하려면 Apache HttpClient 4.0 API를 조기에 중지해야했지만 많은 인터페이스와 내부 구조는 아직 완전히 해결되지 않았습니다. Apache HttpClient 4.0이 성숙함에 따라 프로젝트는 Google이 최신 코드 개선 사항을 코드 트리에 통합 할 것으로 기대했습니다. 불행히도 그것은 일어나지 않았다.

해결 방법 (@Jinu 및 다른 사람들이 제안)을 통해 더 이상 사용되지 않는 오래된 라이브러리를 계속 사용할 는 있지만 useLibrary 'org.apache.http.legacy'실제로 총알을 물고 다른 것 (예 : 기본 Android HttpUrlConnection) 또는 업데이트가 필요하지 않은 경우, 당신은 사용할 수 있습니다 OkHttp 라이브러리 무엇입니까 HttpUrlConnection되어 내부에 근거 어쨌든.

OkHttp는 실제로 Apache 클라이언트와 동일한 API를 사용 하는 호환성 계층 을 가지고 있지만 동일한 기능을 모두 구현하지는 않으므로 마일리지가 다를 수 있습니다.

@MartinPfeffer에서 제안한대로 최신 버전의 Apache 클라이언트를 가져올 수는 있지만 이전에 사용했던 대부분의 클래스와 메소드는 더 이상 사용되지 않으며 업데이트로 인해 버그가 발생할 위험이 매우 높습니다 코드에서 (예를 들어 이전에 프록시 뒤에서 작동했던 일부 연결이 더 이상 작동하지 않는 것을 발견했습니다) 따라서 이것은 훌륭한 해결책이 아닙니다.


1

주제에 며칠을 보낸 후 마침내 문제를 해결했습니다. 불행하게도 확장 파일을 사용하려면 필요합니다. 이 솔루션은 몇 명의 사람들이 제공했지만 저에게 많은 시간을 절약 할 수있는 약간의 세부 사항이 누락되었습니다. 소중한 시간을 절약하기 위해 저와 같은 초보자를위한 일련의 이벤트가 있습니다.

먼저 D : \ Users \ Imre \ AppData \ Local \ Android \ sdk1 \ extras \ google \ play_licensing에서 "library"폴더를 File, New, Import Module로 이동하여 "library"폴더로 이동하여 프로젝트로 가져 왔습니다. SDK 관리자를 열고 팝업 화면 하단에서 "Launch Standalone SDK Manager"를 클릭하면 하단의 "Extras"폴더 위에 포인터를 놓으면 작은 노란색 정보가 나타납니다. 가져와야 할 패키지.

완료되면 "프로젝트"가있는 왼쪽 창의 "라이브러리"섹션으로 이동하여 "Android"탭을 엽니 다. 라이브러리의 java 섹션을 열고 APKExpansionPolicy 클래스를여십시오. 오류가 있고 가져 오기 org.apache.http.NameValuePair 및 가져 오기 org.apache.http.client.utils.URLEncodedUtils가 연한 회색 인 경우 build.gradle (Project : whatever)을 열고 "buildscript"에 있는지 확인하십시오. "dependancies"아래에 "classpath 'com.android.tools.build:gradle:1.5.0"이 포함되어 있습니다. 귀하의 경우 1.5.0이 다를 수 있습니다. Studio 버전에 따라 다릅니다. 광산은 1.5.1입니다. 당신이 더 새로운 경우, 당신은 숫자를 업데이트하라는 메시지가 나타납니다.

그런 다음 "build.gradle (Module : library)로 이동하여"useLibrary 'org.apache.http.legacy "를"android "섹션에 포함하십시오. 지금 동기화 (R / H 상단 모서리)가 제공되어야합니다. 해.

추가 오류 메시지가 표시되면 (다른 방법으로 수행했기 때문에 알 수 없음) Apache가 더 이상 지원되지 않으므로 Apache 파일이 프로젝트에서 누락되었을 수 있습니다. C / D : Users / Yourname / AppData / Local / Android / Sdk / platforms / android-23 / optional에서 찾은 다음 프로젝트 / app / libs 폴더에 복사 / 붙여 넣기하십시오. 거기에 optional.json 및 org.apache.http.legacy.jar 파일이 있어야합니다. 아파치 웹 사이트를 방문하여 최신 버전을 다운로드하는 것이 좋습니다. http://hc.apache.org/downloads.cgi 원하는 곳에서 압축을 풀고 열어서 "lib"로 이동 한 다음 httpclient-4.5.1을 복사하십시오. .jar 파일로 바꾸고 org.apache.http.legacy.jar 파일로 바꾸십시오.

프로젝트를 동기화 및 재 구축 / 정리하십시오.

만약을 대비하여, 터미널 (Android Studio의 L / H 하단)을 열고 "gradlew clean"을 입력하십시오. 몇 가지를 설치합니다. 완료되면 "gradlew assemble"을 입력하십시오. 완료하는 데 몇 분이 걸리지 만 물론 있다면 오류가 발생합니다. 터미널에 아무 것도 입력 할 수 없으면 명령 프롬프트 (Windows 버튼 + R)를 시작하고 cmd를 입력 한 다음 확인을 누르고 작은 검은 색 팝업 화면 제목 (C : \ WINDOWS \ system32 \ cmd.exe)을 마우스 오른쪽 버튼으로 클릭하십시오. 창의 맨 아래에있는, 특성, 옵션에서 "레거시 콘솔 사용"이 두껍게 표시되어 있는지 확인하십시오. A.Studio를 다시 시작하십시오.

행운을 빕니다!


1

위의 답변 중 어느 것도 나를 위해 완전히 효과가 없었기 때문에 게시해야했습니다.

Android Studio를 사용하고 있습니다

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

compileSdkVersion 23
buildToolsVersion "23.0.3"

1 단계 : 최신 jar 파일 다운로드 ( http://www-eu.apache.org/dist//httpcomponents/httpclient/binary/httpcomponents-client-4.5.2-bin.zip )

2 단계 : .jar 파일을 모듈의 libs 폴더에 붙여 넣기 (아직 존재하지 않는 경우 작성) (앱 또는 라이브러리 일 수 있음)

3 단계 : 항아리를 마우스 오른쪽 버튼으로 클릭하고 "라이브러리로 추가". jar 파일을 모듈의 gradle 파일에 종속성으로 자동 추가합니다.

4 단계 : 이제 자동으로 문제가 해결되지만 앱에서 proguard를 사용하는 경우 중복 클래스 파일에 대한 경고가 표시되어 빌드 할 수 없습니다. 알려진 버그이며 보호 규칙에 다음을 추가해야합니다.

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

행운을 빕니다!


0

제 경우에는 안드로이드 프로젝트에서 라이브러리 중 하나를 업데이트했습니다.

캐시 저장 솔루션으로 Reservoir를 사용하고 있습니다 : https://github.com/anupcowkur/Reservoir

나는 갔다 :

compile 'com.anupcowkur:reservoir:2.1'

에:

compile 'com.anupcowkur:reservoir:3.1.0'

라이브러리 작성자가 리포지토리에서 commons-io 라이브러리를 제거해야 내 앱이 더 이상 작동하지 않습니다.

이것을 gradle에 추가하여 commons-io를 수동으로 포함해야했습니다.

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

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


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.