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.3
和httpclient-4.5.1.jar
到project/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.client :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