如何将Apache HTTP API(旧版)添加为Android M的build.grade的编译时依赖项?


96

如前所述这里,Android的M将不支持的Apache HTTP API。该文档指出:

请改用HttpURLConnection类。

要么

要继续使用Apache HTTP API,必须首先在build.gradle文件中声明以下编译时依赖性:

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

我已经将项目对HttpClient的大部分用法转换为HttpURLConnection,但是,我仍然需要在一些领域中使用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 2015年

感谢您对@CommonsWare的快速响应...您是否在顶级build.gradle文件中引用“ classpath'com.android.tools.build:gradle:1.0.0'”行?
维拉特·辛格

1
是。如果1.0.0useLibrary事情我会很惊讶。它可能会在1.3.x之前出现,所以您可以尝试一下1.2.3(AFAIK,最新的生产版本),然后看看会发生什么。
CommonsWare 2015年

我只是尝试了'1.2.3'而没有运气-同样的错误->“找不到DSL等级方法:'useLibrary()'”:/
Virat Singh

是的,因为这与M Developer Preview相关,所以我对此并不感到惊讶。可能您需要1.3.0-rc2(或更新一些,如果有的话)。
CommonsWare 2015年

Answers:


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构建版本,然后也为apache声明了useLibrary,但是我也会得到错误:错误:(204,13)错误:找不到符号类DefaultHttpClient错误:(204,48)错误:找不到符号类DefaultHttpClient错误: (205、13)错误:找不到符号类HttpPost错误:(205、37)错误:找不到符号类HttpPost错误:(207、13)错误:找不到符号类HttpResponse错误:(208、13)错误:找不到查找符号类HttpEntity错误:(209,19)错误:找不到符号变量EntityUtils
Varnit Khandelwal

1
我从答案中遗漏了一些内容:您需要确保gradle类路径位于应用程序顶级构建文件中,而useLibrary必须位于应用程序特定的构建文件中。
Graeme

同样不要忘记添加此jar文件以使上述解决方案起作用:)
Sheraz Ahmad Khilji 2015年

即不再需要@Sheraz -在构建的gradle自动把它捡起
理查德·勒Mesurier

1
@Ratul,您应该在packagingOptions {}块内添加一个块android,在该块内添加exclude 'META-INF/LICENSE'...(每个重复文件的每一行都报告一次)
hidro

28

另一种选择是仅添加jbundle依赖项。这对Android Studio更友好,因为Android Studio不会显示消息“无法解析符号...”。

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

它在mavenCentral()存储库中可用。
nexDev

无法编译:错误:任务':<Proj>:package <Proj> Debug'的执行失败。>无法计算/ Users
Yuriy Chernyshov

您是否尝试过在没有proguard的情况下进行编译(重建)?
nexDev

您可以显示一个与此相关的示例项目吗?现在,我收到此错误:错误:任务':app:packageAllSyncmeappDebugClassesForMultiDex'的执行失败。> java.util.zip.ZipException:重复的条目:org / apache / http / annotation / GuardedBy.class
android开发人员

好吧,您所遇到的错误类型似乎特定于您的项目。您有重复的apache软件包。显然在org.jbundle中。....和另一个在您的一个库中的某个位置。我会在以下位置寻找重复的软件包:
nexDev 2015年


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.jarAndroid/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.httpby 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 2015年

使用上面的配置,我遇到了错误:(
155,0

1

FWIW在不久前就计划删除Apache库。我们的好朋友杰西·威尔逊(Jesse Wilson)在2011年为我们提供了一个线索:http : //android-developers.blogspot.com/2011/09/androids-http-clients.html

Google不久前就停止使用ApacheHTTPClient,因此,除非维护人员更新其代码,否则任何仍依赖该库的库都应放入不推荐使用的库列表中。

<rant> 我无法告诉您,与坚持使用Apache HTTP客户端的人们有多少技术争论。有一些主要的应用程序将要崩溃,因为我不愿透露姓名的前任雇主的管理人员没有听他们的高级工程师的话,也不知道他们在忽略警告时在说什么...但是,桥。

我赢了。

</rant>


1
我的理解是Apache HttpClient 隐藏在android-23中,但实际上并未删除。删除会破坏许多针对较早平台的现有客户端,这些平台未隐藏HttpClient,并且这些现有应用仍有望在android-23上运行。在android-23上,添加useLibrary可以将这些旧类添加到启动类路径,即平台提供的类列表中。这实际上取消隐藏了android-23上的类。
Joe Bowbeer 2015年

不推荐使用某个类时,通常先隐藏该类以防止其继续使用。然后可以随着时间的流逝将其删除。类似于:1.在当前版本中标记为已弃用。2.隐藏在第二个版本中。3.重构所有代码以完全消除旧类。
Coder Roadie

0

要解决此问题,请确保您使用的构建工具版本为“ 23.0.0 rc2”,其中包含以下工具的构建gradle依赖项:

classpath 'com.android.tools.build:gradle:1.3.0-beta2'
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.