Android M 용 build.grade에 Apache HTTP API (레거시)를 컴파일 시간 종속성으로 추가하는 방법은 무엇입니까?


96

여기 에서 언급했듯이 Android M은 Apache HTTP API를 지원하지 않습니다. 문서 상태 :

대신 HttpURLConnection 클래스를 사용하십시오.

또는

Apache HTTP API를 계속 사용하려면 먼저 build.gradle 파일에서 다음 컴파일 시간 종속성을 선언해야합니다.

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

나는 그러나, 나는 아직도, HttpURLConnection의에 HttpClient를 내 프로젝트의 사용의 변환 다량이 필요 HttpClient를 몇 지역에서 사용할 수 있습니다. 따라서 'org.apache.http.legacy'를 컴파일 타임 종속성으로 선언하려고하지만 build.gradle에서 오류가 발생합니다.

Gradle DSL 메서드를 찾을 수 없음 : 'useLibrary ()'

내 질문은 : 어떻게 'org.apache.http.legacy'를 프로젝트에서 컴파일 타임 종속성으로 선언합니까?

어떤 도움이라도 대단히 감사합니다. 감사


3
최신 Android 용 Gradle 플러그인을 사용하고 있는지 확인하세요. 제 생각에는 이것이 정말 새로운 것이므로 1.3.0-rc2. Apache의 자체 Android 호환 버전 HttpClient 사용을 고려할 수도 있습니다 .
CommonsWare

빠른 응답에 감사드립니다 @CommonsWare ... 최상위 build.gradle 파일의 "classpath 'com.android.tools.build:gradle:1.0.0'"줄을 참조하고 계십니까?
Virat Singh

1
예. 물건 1.0.0이 있으면 오히려 놀랄 useLibrary것입니다. 1.3.x 이전에 들어 왔을 가능성이 있으므로 1.2.3(AFAIK, 최신 프로덕션 릴리스) 시도 하여 어떤 일이 발생하는지 확인할 수 있습니다.
CommonsWare

방금 '1.2.3'을 시도했지만 행운이 없습니다-동일한 오류-> "Gradle DSL 메소드를 찾을 수 없음 : 'useLibrary ()'": /
Virat Singh

예, 이것은 M 개발자 미리보기와 연결되어 있기 때문에 충격을받지 않습니다. 아마도 당신이 필요로 할 것입니다 1.3.0-rc2(또는 새로운 것이 있다면).
CommonsWare

답변:


172

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를 선언하지만 오류가 발생합니다. Error : (204, 13) error : cannot find symbol class DefaultHttpClient Error : (204, 48) error : cannot find symbol class DefaultHttpClient Error : (205, 13) 오류 : 기호 클래스를 찾을 수 없습니다. HttpPost 오류 : (205, 37) 오류 : 기호 클래스를 찾을 수 없습니다. HttpPost 오류 : (207, 13) 오류 : 기호 클래스를 찾을 수 없습니다. HttpResponse 오류 : (208, 13) 오류 : 불가능 기호 찾기 클래스 HttpEntity 오류 : (209, 19) 오류 : 기호 변수 EntityUtils를 찾을 수 없습니다
Varnit 김시연

1
내가 대답에서 놓친 것 : gradle 클래스 경로가 앱 최상위 빌드 파일에 있는지 확인해야하며 앱별 빌드 파일에 useLibrary있어야합니다.
Graeme 2015 년

또한 위의 솔루션이 작동하도록하려면 이 jar 파일 을 추가하는 것을 잊지
마십시오.

더 이상 필요하지 않은 @Sheraz-gradle 빌드가 자동으로 선택
Richard Le Mesurier

1
@Ratul 당신은 packagingOptions {}블록 내부에 android블록을 추가해야합니다.이 블록 내부 에 추가 exclude 'META-INF/LICENSE'... (중복 파일 당 각 줄보고 됨)
hidro

28

또 다른 대안은 jbundle 종속성을 추가하는 것입니다. Android Studio는 "cannot resolve symbol ..."이라는 메시지를 표시하지 않으므로 Android Studio에 더 친숙합니다.

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

mavenCentral () 저장소에서 사용할 수 있습니다.
nexDev 2015-08-27

컴파일 할 수 없습니다. 오류 : ': <Proj> : package <Proj> Debug'작업에 대한 실행이 실패했습니다. > /Users/<user>/Documents/<Proj>/<Activity>/build/intermediates/classes-proguard/<Proj>/debug/classes.jar의 해시를 계산할 수 없습니다
Yuriy Chernyshov

proguard없이 컴파일 (재 구축) 해 보셨습니까?
nexDev 2015-08-29

이것으로 작동하는 샘플 프로젝트를 보여 주시겠습니까? 이제이 오류가 발생합니다. Error : Execution failed for task ': app : packageAllSyncmeappDebugClassesForMultiDex'. > java.util.zip.ZipException : 중복 항목 : org / apache / http / annotation / GuardedBy.class
안드로이드 개발자

글쎄, 당신이 가진 오류의 유형은 당신의 프로젝트에 특정한 것 같습니다. 중복 된 아파치 패키지가 있습니다. org.jbundle에있는 것 같습니다. .... 그리고 다른 하나는 라이브러리 중 하나에 있습니다. 나는 중복 된 패키지를 찾을 것이다 :
nexDev


13

build.gradle 파일에서 > 노트에 따라 useLibrary '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'
}

'제공됨'을 사용하면 종속성이 apk에 포함되지 않습니다.


11

: 그냥 파일 복사 org.apache.http.legacy.jar에서 Android/Sdk/platforms/android-23/optional프로젝트 폴더로 폴더를app/libs .

23.1.1의 매력처럼 작동했습니다.


2

이 문제를 다음과 같이 해결했습니다.

1.) 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 메서드를 찾을 수 없음 : 'provided ()'
RoFF

1

FWIW 아파치 라이브러리 제거는 얼마 전에 예고되었습니다. 우리의 좋은 친구 Jesse Wilson이 2011 년에 단서를주었습니다. http://android-developers.blogspot.com/2011/09/androids-http-clients.html

Google은 얼마 전에 ApacheHTTPClient에 대한 작업을 중단 했으므로 유지 관리자가 코드를 업데이트하지 않는 한 여전히 사용중인 라이브러리는 사용되지 않는 라이브러리 목록에 추가되어야합니다.

<rant> 아파치 HTTP 클라이언트를 고집하는 사람들과 내가 얼마나 많은 기술적 인 논쟁을 벌 였는지 말할 수 없습니다. 이름이 알려지지 않은 이전 고용주의 경영진이 최고 엔지니어의 말을 듣지 않았거나 경고를 무시했을 때 그들이 말하는 내용을 알지 못했기 때문에 중단 될 몇 가지 주요 앱이 있습니다. 다리.

내가 이겼어.

</rant>


1
내 이해는 Apache HttpClient가 android-23에 숨겨져 있지만 실제로 제거되지는 않았다는 것입니다. 제거하면 HttpClient가 숨겨지지 않은 이전 플랫폼을 대상으로하는 많은 기존 클라이언트가 손상되며 이러한 기존 앱은 여전히 ​​android-23에서 실행될 것으로 예상됩니다. android-23에서 useLibrary를 추가하면 이러한 레거시 클래스를 부팅 클래스 경로, 즉 플랫폼에서 제공하는 클래스 목록에 추가하는 역할을합니다. 이것은 본질적으로 android-23의 클래스를 숨김 해제합니다.
Joe Bowbeer

클래스가 더 이상 사용되지 않을 때 앞으로 사용되지 않도록 먼저 숨기는 것이 일반적입니다. 그런 다음 시간이 지남에 따라 제거 할 수 있습니다. 다음과 같습니다. 1. 현재 버전에서 사용되지 않음으로 표시합니다. 2. 두 번째 버전에서 숨 깁니다. 3. 모든 코드를 리팩터링하여 이전 클래스를 완전히 제거합니다.
Coder Roadie

0

문제를 해결하려면 다음 도구 빌드 gradle 종속성과 함께 빌드 도구 버전 '23 .0.0 rc2 '를 사용하고 있는지 확인하세요.

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