4

我在我的 logcat 中遇到了一些错误,这些错误在尝试执行一些单一请求时使我的应用程序崩溃。我知道您必须生成一个包含所有依赖项的特殊 unirest jar,但我遇到了 maven 问题并且没有这样做,而是将依赖项单独包含在 libs 文件夹中。我已将问题缩小到下面的单个错误。

日志猫:

java.lang.VerifyError: com/mashape/unirest/http/options/Options
        at com.mashape.unirest.http.HttpClientHelper.prepareRequest(HttpClientHelper.java:154)
        at com.mashape.unirest.http.HttpClientHelper.request(HttpClientHelper.java:131)
        at com.mashape.unirest.request.BaseRequest.asJson(BaseRequest.java:68)

我知道 java.lang.verifyerror 是由在编译时与运行时给出的不同库引起的。但我不知道如何解决这个问题。请帮忙,确保我需要的所有依赖项都在下面,因为在此之前我没有使用过 unirest。

构建.Gradle:

dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile files('libs/unirest-java-1.3.20.jar')
compile files('libs/rebound-0.3.6.jar')
compile files('libs/commons-io-2.4.jar')
compile files('libs/json-20140107.jar')
compile files('libs/httpmime-4.3.5.jar')
compile files('libs/httpclient-4.3.5.jar')
compile files('libs/httpasyncclient-4.0.2.jar')
compile files('libs/httpcore-4.3.2.jar')
compile files('libs/commons-codec-1.6.jar')
compile files('libs/commons-logging-1.1.3.jar')
}

我的 libs 文件夹是什么样的:

commons-io-2.4.jar
httpcore-4.3.2.jar
httpclient-4.3.5.jar
commons-logging-1.1.3.jar
json-20140107.jar
rebound-0.3.6.jar
unirest-java-1.3.20.jar
commons-codec-1.6.jar
httpmime-4.3.5.jar
httpasyncclient-4.0.2.jar

还将它包含在 build.gradle 中,因为我在尝试构建 gradle 文件时遇到了重复文件错误:

packagingOptions {
    exclude 'META-INF/DEPENDENCIES'
    exclude 'META-INF/NOTICE'
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/LICENSE.txt'
    exclude 'META-INF/NOTICE.txt'
}
4

1 回答 1

1

我知道你问这个问题已经有一段时间了。我认为 Android 会覆盖位于 org.apache.http 中的公共类。您不能自己覆盖它们。尝试将下载的包重新定位到另一个位置,例如 surrogate.org.apache.http 以正确使用它们。

来自https://hc.apache.org/httpcomponents-client-4.3.x/android-port.html

Google Android 1.0 发布时带有 Apache HttpClient 的预测试版快照。为了配合第一个 Android 版本,Apache HttpClient 4.0 API 不得不提前冻结,而许多接口和内部结构仍未完全制定。随着 Apache HttpClient 4.0 的成熟,该项目期望 Google 将最新的代码改进整合到他们的代码树中。不幸的是,它没有发生。Android 附带的 Apache HttpClient 版本实际上已成为一个分支。最终,谷歌决定停止进一步开发他们的分支,同时拒绝升级到 Apache HttpClient 的股票版本,理由是兼容性问题是做出这样决定的原因。因此,那些希望继续在 Android 上使用 Apache HttpClient API 的 Android 开发人员无法利用更新的功能,

如果您继续阅读,您会发现以下内容:

为了避免与 Android 运行时中包含的相同类的旧版本发生冲突,必须使用不同的名称复制(或着色)一些实现类。可以通过避免使用 'org.apache.http.**.*HC4' 类来增加与 HttpClient 库存版本的兼容性。

利用

dependencies {
    compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1'
}

包括httpcomponents。

如果您不想手动重新定位依赖项,则可能必须使用shadowJar插件重新定位依赖项。

编辑:

我发现这个很棒的教程对我有用。甚至认为我会推荐使用 AndroidAsync 或 Volley 来建立与网络服务器的连接。

于 2015-03-14T16:12:40.360 回答