ChatGPT解决这个技术问题 Extra ChatGPT

Android Gradle Apache HttpClient 不存在?

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


J
Jarett Millard

如果您使用 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


将您的构建脚本更改为类路径'com.android.tools.build:gradle:1.3.0'
已经有 1.3.1。仍然无法解析 Android Studio 中的类:Error:(14, 23) error: package org.apache.http does not exist
安卓工作室 1.4 测试版 2
如果你想使用最新版本的 apache http 组件怎么办?
感谢 Jinu,必须将 Android Studio 从 1.3 更新到以上版本。得到它的工作
U
Uwais A

我遇到了这个问题,然后找到了这些页面:在这里你可以看到 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 替换它,这比我想象的要容易。
同意苏克。这些答案都不适合我,所以我最终也摆脱了 Apache 库。我对 Android 开发很陌生,但它很简单。
我有同样的问题,我用 useLibrary 'org.apache.http.legacy' 修复了 Milos 所说的......但是对于 @ssuukk 有你的问题,你可以尝试总是添加这个:android { PackagingOptions { exclude 'META-INF/LICENSE ' 排除 'META-INF/DEPENDENCIES' 排除 'META-INF/NOTICE' 排除 'META-INF/NOTICE.txt' 排除 'META-INF/MANIFEST' }}
C
CopsOnRoad

将此库添加到 build.gradle

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

有人可以解释一下吗?为什么这使它起作用?除了添加依赖项之外,为什么我们还需要添加这一行?
@Dan 这是因为 org.apache.http 库已在版本 23 中删除。
澄清一下,这不会进入根目录 build.gradle,而是在您正在构建的模块文件夹中(即“app”)
B
Benjamin Piette

我建议您用新的 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?
@TrickySolutions 抱歉不知道,还没有使用 PUT 方法。
这不是一个真正的解决方案!在下面查看@Jinu 的答案。
H
Hamid Zandi

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”。
C
CopsOnRoad

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

useLibrary  'org.apache.http.legacy'

到您的 build.gradle 文件。


D
Daniel Nugent

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

首先,用您当前的配置试试这个,从 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'
} 

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

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 有什么用?
M
Martin Pfeffer

我遇到了同样的问题。 Daniel Nugent 的回答有点帮助(在遵循他的建议 HttpResponse 被发现后 - 但 HttpClient 仍然丢失)。

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

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

希望能帮助到你。


S
Sophia

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

N
NOT_A_PROGRAMMER

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

第 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。你能弄清楚吗?
I
Immy

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

首先,我从 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。

祝你好运!


C
Community

现有 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 { 1},或者如果这不能满足您的需要,您可以使用 OkHttp library,这就是 HttpUrlConnection 就是 internally based upon

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

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


D
Debasish Mitra

我不得不发布,因为上述答案都没有完全适合我。

我正在使用 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并“添加为库”。它会自动将 jar 文件作为依赖项添加到模块的 gradle 文件中

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

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

祝你好运!


S
Simon

就我而言,我更新了我的 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


L
Likwidsage

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

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