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都没有解决方案,因此我希望这个问题对将来的搜索者有所帮助。

Answers:


39

我建议您使用新的HttpURLConnection替换已弃用的apache HttpClient。

那是一个更干净的解决方案,它很容易迁移,通常,坚持最新的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方法。
本杰明·皮耶特

521

如果您使用目标SDK为23,请在build.gradle中添加以下代码

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

并将您的buildscript更改为

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

欲了解更多信息,请点击此链接


7
将您的buildscript更改为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 2015年

2
android studio 1.4 beta 2
Jinu 2015年

2
如果要使用最新版本的apache http组件怎么办?
russellhoff 2015年

2
Thanx Jinu,必须将Android Studio从1.3更新到更高版本。得到它的工作
mithil1501 2015年

94

我遇到了这个问题,然后找到了以下页面:在这里您可以看到apache库已被弃用,但是它并未被删除,因此应该可以使用。没有。

请参阅

在这里,您可以看到如何将apache库包含到您的项目中

请参阅

我通过按照第二个链接的建议将以下内容添加到我的build.gradle文件中来解决了问题。

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

但是,这仅在使用gradle 1.3.0-beta2或更高版本时才有效,因此,如果您使用的是较低版本,则必须将其添加到buildscript依赖项中:

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

希望这可以帮助。


对我来说,它失败了:错误:任务':xenoAmp:mergeDebugJavaResources'的执行失败。>无法为L:\ Projekty \ xenoampgit \ xenoAmp \ build \ intermediates \ packagedJarsJavaResources \ debug \ httpclient-android-4.3.5.1.jar1037172435 \ META-INF \ LICENSE的扩展文件夹确定,文件夹为L:\ Projekty \ xenoampgit \ xenoAmp \ build \ intermediates \ sourceFolderJavaResources \ debug,L:\ Projekty \ xenoampgit \ xenoAmp \ build \ intermediates \ packagedJarsJavaResources \ debug
ssuukk

@ssuukk您好,您找到此错误的解决方案了吗?
CeccoCQ

2
不幸的是,解决方案是将目标更改为当前最高的API,这打破了很多事情!然后,我不得不添加“ useLibrary”,“ classpath”以及参考旧版apache lib,如本问题中其他地方所述。在再次编译之后,我决定完全放弃Apache代码,并全部替换为URLConnection,这比我想象的要容易。
ssuukk 2015年

同意ssuukk。这些答案对我都不起作用,因此我最终也摆脱了Apache库。我对Android开发很陌生,但是很简单。
John81

我遇到了同样的问题,并用useLibrary'org.apache.http.legacy'修复了Milos的说法...但是,对于@ssuukk,请始终尝试添加以下内容:android {包装选项{排除“ META-INF / LICENSE” '排除'META-INF / DEPENDENCIES'排除'META-INF / NOTICE'排除'META-INF / NOTICE.txt'排除'META-INF / MANIFEST'}}
Alexiscanny15年

53

将此库添加到 build.gradle

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

有人可以解释吗?为什么这使它起作用?除了添加依赖项,为什么还要添加此行?

2
@Dan这是因为org.apache.http库已在版本23中删除
。– eltiare

需要说明的是,这并没有进入根目录build.gradle,而是在您正在构建的模块文件夹(即“ app”)中
hamx0r

37

副本org.apache.http.legacy.jar是在Android/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 2015年

为什么这不是答案?
迪布尔

1
我也是。有人应该接受这个答案,而不是现在接受的答案。
伊万·法扎努克

这是阻力最小的途径,不确定我是否要降低等级。对我来说编译很好。
Ed Manners

谢谢!这适用于gradle-experimental实验0.6.0-alpha5插件。实验性插件中似乎不存在“ useLibrary”。
monkey0506 '16

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.3httpclient-4.5.1.jar放在project/libs文件夹中
  5. 右键单击jar,然后选择添加为库

希望能帮助到你。


9

我遇到了类似的问题,您也许可以使用类似的方法使其正常工作。

首先,使用您当前的配置尝试此操作,排除httpclienthttpmime

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中,排除httpclienthttpmime

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

谢谢您的回答,我怕这两个都不对我
有用

@tur很奇怪,第二个选项对我有用。确保第二个选项删除了旧的jar文件。
Daniel Nugent

libs/core.jar为了什么
IgorGanapolsky

7

Jinu和Daniel的完美答案

此外,如果您的compileSdkVersion为19(在我的情况下),我通过使用此解决了问题

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.clientent:4.1.2”。我正在使用实验性Gradle 0.6.0-beta。你能弄清楚吗?
RoFF

1

普通Android上提供的Apache HTTP客户端版本非常旧

Google Android 1.0发行时带有Apache HttpClient的Beta之前版本快照。为了与第一个Android版本一致,必须过早冻结Apache HttpClient 4.0 API,而许多接口和内部结构仍未完全解决。随着Apache HttpClient 4.0的日趋成熟,该项目期望Google将最新的代码改进纳入其代码树中。不幸的是,这没有发生。

尽管您可以通过useLibrary 'org.apache.http.legacy'变通办法继续使用旧的不赞成使用的库(@Jinu等建议),但您确实需要硬着头皮并更新到其他内容,例如本机Android HttpUrlConnection,或者如果它不满足您的需要,您可以使用OkHttp库,该无论如何HttpUrlConnection都是基于内部的

OkHttp实际上具有一个兼容层,该兼容层使用与Apache客户端相同的API,尽管它们没有实现所有相同的功能,所以您的工作量可能会有所不同。

虽然可以导入较新版本的Apache客户端(如@MartinPfeffer所建议),但您之前使用的大多数类和方法可能已被弃用,并且存在很大的更新风险会引入错误在您的代码中(例如,我发现以前从代理后面工作的某些连接不再起作用),因此这不是一个很好的解决方案。


1

在这个问题上花了几天的时间后,我终于解决了。不幸的是,如果我们要使用扩展文件,则需要它。该解决方案由此处的一些人提供,但是对我来说,答案缺少一些小细节,可以为我节省很多时间。这是为像我这样的新手节省您宝贵时间的一系列事件。

首先,我进入“文件”,“新建”,“导入模块”并导航到“库”文件夹,从D:\ Users \ Imre \ AppData \ Local \ Android \ sdk1 \ extras \ google \ play_licensing将“库”文件夹导入到项目中。如果打开SDK Manager并在弹出窗口底部单击“启动独立的SDK Manager”,则可以将鼠标指针悬停在底部的“ Extras”文件夹上,黄色的小信息将告诉您在哪里可以找到您需要导入的软件包。

完成后,转到带有“项目”的左窗格中的“库”部分,并在其中打开“ Android”选项卡。打开库的Java部分,然后打开APKExpansionPolicy类。如果出现错误,并且导入org.apache.http.NameValuePair和导入org.apache.http.client.utils.URLEncodedUtils为浅灰色,请打开build.gradle(Project:whatever)并确保在“ buildscript”中在“依赖项”下,您包含了“ 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 /您的名称/ AppData / Local / Android / Sdk / platforms / android-23 / optional,然后将其复制/粘贴到yourproject / app / libs文件夹中。您应该在其中有一个optional.json和一个org.apache.http.legacy.jar文件。您最好访问apache的网站并下载最新版本: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,则会向您发出有关类文件重复的警告,并且不允许您进行构建。这是一个已知的错误,您需要在proguard-rules中添加以下内容

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

祝好运!


0

就我而言,我更新了我的android项目中的一个库。

我正在使用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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.