Android Gradle Apache HttpClient 不存在?

Posted

技术标签:

【中文标题】Android Gradle Apache HttpClient 不存在?【英文标题】:Android Gradle Apache HttpClient does not exist? 【发布时间】:2015-10-04 16:30:12 【问题描述】:

我正在尝试将 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 都没有解决方案,所以我希望这个问题能帮助未来的搜索者。

【问题讨论】:

【参考方案1】:

如果您使用 target sdk as 23 在您的 build.gradle 中添加以下代码

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

并将您的构建脚本更改为

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

更多信息请关注link

【讨论】:

将你的 buildscript 更改为 classpath 'com.android.tools.build:gradle:1.3.0' 已经有 1.3.1。仍然无法解析 Android Studio 中的类:Error:(14, 23) error: package org.apache.http does not exist android studio 1.4 beta 2 如果你想使用最新版本的apache http组件怎么办? Thanx Jinu,将 Android Studio 从 1.3 升级到以上版本是必须的。搞定了【参考方案2】:

我遇到了这个问题,然后找到了这些页面: 在这里你可以看到 apache 库已被弃用,但它没有被删除,所以它应该可以工作。它没有。

See。

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

See.

我按照第二个链接中的建议将以下内容添加到我的 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 您好,您找到解决此错误的方法了吗? 不幸的是,解决方案是将目标更改为当前最高的 API,这破坏了很多事情!然后我不得不添加“useLibrary”、“classpath”以及参考旧版 apache lib,如本问题其他地方所述。在它再次可编译之后,我决定完全放弃 Apache 代码,并用 URLConnection 替换它,这比我想象的要容易。 同意ssuukk。这些答案都不适合我,所以我最终也摆脱了 Apache 库。我对 Android 开发很陌生,但它很简单。 我遇到了同样的问题,我用 useLibrary 'org.apache.http.legacy' 修复了 Milos 的说法......但是对于 @ssuukk 有你的问题,你可以尝试总是添加这个:android PackagingOptions exclude 'META-INF/LICENSE' exclude 'META-INF/DEPENDENCIES' exclude 'META-INF/NOTICE' exclude 'META-INF/NOTICE.txt' exclude 'META-INF/MANIFEST' 【参考方案3】:

将此库添加到build.gradle

 android 
      useLibrary 'org.apache.http.legacy'
 

【讨论】:

有人能解释一下吗?为什么这使它起作用?除了添加依赖,为什么还要添加这一行? @Dan 这是因为 org.apache.http 库在版本 23 中被删除了。 澄清一下,这不会进入根目录build.gradle,而是在您正在构建的模块文件夹中(即“app”)【参考方案4】:

我建议你用新的 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();

第二步之二

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

变成:

int status = urlConnection.getResponseCode();

【讨论】:

嘿@Benjamin,如何使用 PUT 方法发送 URL? @TrickySolutions 抱歉,还没有使用 PUT 方法。 这不是真正的解决方案!在下面查看@Jinu 的答案。【参考方案5】:

Android/Sdk/platforms/android-23/optional文件夹中的org.apache.http.legacy.jar复制到app/libs

并将这一行添加到 app.gradle 文件中

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

但是如果你使用的jar库比较多,可以这样使用

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

【讨论】:

在我的另一个项目中,这被证明是唯一有效的答案+1,谢谢。 为什么这不是答案? 对我来说也一样。应该有人接受这个答案,而不是现在接受的答案。 这是阻力最小的路径,不确定我要降级gradle。它对我来说编译得很好。 谢谢!这适用于 gradle-experimental 0.6.0-alpha5 插件。实验性插件中似乎不存在“useLibrary”。【参考方案6】:

基本上你需要做的就是添加:

useLibrary  'org.apache.http.legacy'

到您的build.gradle 文件。

【讨论】:

【参考方案7】:

我遇到了类似的问题,你也许可以使用类似的方法让它工作。

首先,用你当前的配置试试这个,从httpmime中排除httpclient

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'
 

就我而言,我使用以下 jar 修复了它:

httpclient-android-4.3.5.1.jar httpmime-4.3.5.jar

然后,在 build.gradle 中,从 httpmime 中排除 httpclient

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 文件。 libs/core.jar 是干什么用的?【参考方案8】:

我遇到了同样的问题。丹尼尔纽金特的回答有点帮助(在遵循他的建议后找到了HttpResponse - 但仍然缺少HttpClient)。

所以这是为我解决的问题:

    (如果还没有完成,推荐之前的导入语句) 访问http://hc.apache.org/downloads.cgi 从二进制部分获取4.5.1.zip 解压并粘贴httpcore-4.4.3httpclient-4.5.1.jarproject/libs文件夹中 右键单击 jar 并选择 添加为库

希望对你有帮助。

【讨论】:

【参考方案9】:

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'
    

【讨论】:

【参考方案10】:

这就是我所做的,它对我有用。

第 1 步:在 build.grade(module: app) 中添加这个

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

第 2 步:同步项目并完成。

【讨论】:

它无法解决并出现错误“无法解决:org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.cli‌​‌​ent :4.1.2"。我正在使用实验 gradle 0.6.0-beta。你能弄清楚吗?【参考方案11】:

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

首先我从 D:\Users\Imre\AppData\Local\Android\sdk1\extras\google\play_licensing 导入“library”文件夹到项目,方法是进入 File、New、Import Module 并导航到“library “ 文件夹。如果您打开 SDK Manager 并单击弹出屏幕底部的“Launch Standalone 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”部分中。应提供立即同步(右/右上角)。去做吧。

如果您收到更多错误消息(我不知道,因为我是反过来做的),您的项目中可能缺少 Apache 文件,因为不再支持 apache。在 C/D:Users/Yourname/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,点击 OK,右键单击黑色小弹出屏幕的标题(C:\WINDOWS\system32\cmd.exe) ,属性,选项,在窗口底部检查“使用旧版控制台”是否加粗。重启 A.Studio。

祝你好运!

【讨论】:

【参考方案12】:

Android 上提供的 Apache HTTP 客户端版本是 very very old。

Google Android 1.0 发布时带有 Apache HttpClient 的预测试版快照。为了与第一个 Android 版本相吻合,Apache HttpClient 4.0 API 不得不提前冻结,而许多接口和内部结构仍未完全确定。随着 Apache HttpClient 4.0 的成熟,该项目期望 Google 将最新的代码改进整合到他们的代码树中。不幸的是,它没有发生。

虽然您可以通过useLibrary 'org.apache.http.legacy' 解决方法(@Jinu 和其他人建议)继续使用旧的已弃用库,但您确实需要硬着头皮更新到其他东西,例如原生 Android HttpUrlConnection,或者如果这不能满足您的需求,您可以使用 OkHttp library,这就是 HttpUrlConnection 是 internally based upon 反正。

OkHttp 实际上有一个compatibility layer,它使用与 Apache 客户端相同的 API,尽管它们没有实现所有相同的功能,因此您的里程可能会有所不同。

虽然it is possible to import a newer version of the Apache client(如@MartinPfeffer 所建议),您之前使用的大多数类和方法很可能已被弃用,并且更新会在您的代码中引入错误的风险很大(例如我发现一些以前从代理后面工作的连接不再工作),所以这不是一个很好的解决方案。

【讨论】:

【参考方案13】:

我不得不发帖,因为以上答案都不适合我。

我正在使用 Android Studio

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

compileSdkVersion 23
buildToolsVersion "23.0.3"

第一步:下载最新的jar文件(http://www-eu.apache.org/dist//httpcomponents/httpclient/binary/httpcomponents-client-4.5.2-bin.zip)

第 2 步:将 .jar 文件复制粘贴到模块(可以是应用程序或库)中的 libs 文件夹(如果不存在则创建)

第 3 步:右键单击 jar 并“添加为库”。它会自动将 jar 文件作为依赖项添加到模块的 gradle 文件中

第 4 步:现在您的问题将自动得到解决,但如果您在应用程序中使用 proguard,它会警告您有关重复的类文件,并且不会让您构建。这是一个已知的错误,您需要在您的 proguard-rules 中添加以下内容

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

祝你好运!

【讨论】:

【参考方案14】:

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

我使用 Reservoir 作为我的缓存存储解决方案:https://github.com/anupcowkur/Reservoir

我来自:

compile 'com.anupcowkur:reservoir:2.1'

收件人:

compile 'com.anupcowkur:reservoir:3.1.0'

库作者必须从 repo 中删除了 commons-io 库,所以我的应用程序不再工作。

我必须通过将其添加到 gradle 来手动包含 commons-io:

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

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

【讨论】:

【参考方案15】:

我克隆了以下内容:https://github.com/google/play-licensing

然后我将它导入到我的项目中。

【讨论】:

以上是关于Android Gradle Apache HttpClient 不存在?的主要内容,如果未能解决你的问题,请参考以下文章

Android Gradle Apache HttpClient 不存在?

如何在android studio中查看当前使用的gradle版本和gradle插件版本

如何在android studio中查看当前使用的gradle版本和gradle插件版本

apache_conf 为Android Gradle配置GitLab Runner

Android Gradle 项目中包括 Apache HttpComponents 的问题

Android Studio build gradle project info 卡主不动解决方法.