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

Posted

技术标签:

【中文标题】Android Gradle 项目中包括 Apache HttpComponents 的问题【英文标题】:Problems including Apache HttpComponents in Android Gradle project 【发布时间】:2013-10-17 12:00:32 【问题描述】:

我尝试使用 build.gradle 文件将 httpmime 包含在我的应用程序中,并且一切编译正常。相反,当应用程序尝试实际使用 MultipartEntityBuilder 类时,日志上会出现一堆 WARN 级别的消息,表明存在问题。

这是我的 build.gradle 依赖项的摘录:

编译('org.apache.httpcomponents:httpmime:4.+') 排除模块:“httpclient”

以下是错误:

10-09 13:39:37.367 2409-2426/com.company.app W/dalvikvm: VFY: 无法解析 Lorg/apache/http/entity/ContentType 中的静态字段 6967 (DEFAULT_BINARY); 10-09 13:39:37.367 2409-2426/com.company.app W/dalvikvm: VFY: 无法找到签名中引用的类 (Lorg/apache/http/entity/ContentType;) 10-09 13:39:37.367 2409-2426/com.company.app W/dalvikvm: VFY: 无法找到签名中引用的类 (Lorg/apache/http/entity/ContentType;) 10-09 13:39:37.367 2409-2426/com.company.app W/dalvikvm: VFY: 无法解析 Lorg/apache/http/entity/ContentType 中的静态字段 6967 (DEFAULT_BINARY); 10-09 13:39:37.367 2409-2426/com.company.app W/dalvikvm: VFY: 无法找到签名中引用的类 (Lorg/apache/http/entity/ContentType;) 10-09 13:39:37.367 2409-2426/com.company.app W/dalvikvm: VFY: 无法找到签名中引用的类 (Lorg/apache/http/entity/ContentType;) 10-09 13:39:37.367 2409-2426/com.company.app W/dalvikvm: VFY: 无法解析 Lorg/apache/http/entity/ContentType 中的静态字段 6967 (DEFAULT_BINARY); 10-09 13:39:37.367 2409-2426/com.company.app W/dalvikvm: VFY: 无法找到签名中引用的类 (Lorg/apache/http/entity/ContentType;) 10-09 13:39:37.367 2409-2426/com.company.app W/dalvikvm: VFY: 无法找到签名中引用的类 (Lorg/apache/http/entity/ContentType;) 10-09 13:39:37.377 2409-2426/com.company.app W/dalvikvm: VFY: 无法解析静态方法 19478: Lorg/apache/http/util/Args;.notNull (Ljava/lang/Object;Ljava /lang/String;)Ljava/lang/Object; 10-09 13:39:37.377 2409-2426/com.company.app W/dalvikvm: VFY: 无法解析 Lorg/apache/http/entity/ContentType 中的静态字段 6968 (DEFAULT_TEXT); 10-09 13:39:37.377 2409-2426/com.company.app W/dalvikvm: VFY: 无法找到签名中引用的类 (Lorg/apache/http/entity/ContentType;) 10-09 13:39:37.377 2409-2426/com.company.app W/dalvikvm: VFY: 无法找到签名中引用的类 (Lorg/apache/http/entity/ContentType;)

java类:

导入android.util.Log; 导入 java.io.IOException; 导入 java.io.InputStream; 导入 java.io.OutputStream; 导入 java.net.HttpURLConnection; 导入 java.net.URL; 导入 org.apache.http.HttpEntity; 导入 org.apache.http.entity.mime.MultipartEntityBuilder; 公共类 FileUploader 私人最终静态字符串边界=“__--__--__SERVETHEOVERMIND-__-_”; public void uploadFile(String targetUrl, MultipartEntityBuilder upload, UploadHandler after) Log.v("FileUploader", "上传到" + targetUrl); HttpURLConnection con = null; 输出流 os = null; 输入流是 = null; 尝试 HttpEntity uploadEntity = upload.build(); URL postTo = 新 URL(targetUrl); con = (HttpURLConnection) postTo.openConnection(); con.setRequestMethod("POST"); con.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + BOUNDARY); con.setDoOutput(true); con.setDoInput(true); con.setUseCaches(false); con.addRequestProperty("Connection", "Keep-Alive"); con.setRequestProperty("内容长度", String.valueOf(uploadEntity.getContentLength())); os = con.getOutputStream(); uploadEntity.writeTo(os); os.close(); 连接(); is = con.getInputStream(); after.consumeUploadResponse(is); con.disconnect(); 捕捉(IOException e) e.printStackTrace(); 如果(con!= null) con.disconnect(); 如果(操作系统!= null) 尝试 os.close(); 捕捉(IOException e) Log.v("Uploader", "关闭的输出流"); 如果(是!= null) 尝试 is.close(); 捕捉(IOException e) Log.v("Uploader", "关闭的输入流"); 公共接口 UploadHandler 公共无效消费上传响应(输入流流);

[EDIT] 正确的依赖关系,根据答案

编译('org.apache.httpcomponents:httpmime:4.+') 排除模块:“httpclient” 编译('org.apache.httpcomponents:httpcore:4.+') 排除模块:“httpclient”

[第二次编辑] 仍然有问题 - 现在是这些其他缺失的位,但可能是后端的问题:

10-10 11:51:54.998 29597-29638/com.company.app W/dalvikvm: VFY: 无法解析 Lorg/apache/http/message/BasicHeaderValueParser 中的静态字段 7465 (INSTANCE); 10-10 11:51:54.998 29597-29638/com.company.app W/dalvikvm: VFY: 无法解析 Lorg/apache/http/message/BasicHeaderValueFormatter 中的静态字段 7459 (INSTANCE);

[还有一次编辑]

在这种情况下,最后一点缺失的位似乎对 MultipartEntityBuilder 的成功使用没有任何影响。

【问题讨论】:

您是否设法删除了 Lorg/apache/http/message.... 静态字段警告?我现在似乎遇到了类似的问题。 您上面的第一个代码块修复了我在 android studio 中收到的警告。谢谢! 【参考方案1】:

您需要将 httpcore-4.3.jar 添加到您的 java 构建路径。我遇到了同样的问题,添加这个jar后它就消失了。

【讨论】:

我以为就是这样,但我仍然遇到类似的问题 看起来它可能有效,尽管有最新的错误消息 - 现在我正在查看 rails 后端的问题 如果您是 Android Studio 新手,现在确定如何将 jar 添加到构建路径,请参阅类似问题的答案:***.com/a/28712564 - 您只需从 httpcore 搜索即可httpmime.【参考方案2】:

这就是我在毕业时所做的......

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



在安卓里面

android
packagingOptions 
    exclude 'META-INF/DEPENDENCIES'
    exclude 'META-INF/NOTICE'
    exclude 'META-INF/LICENSE'


【讨论】:

【参考方案3】:
 compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1'  compile('org.apache.httpcomponents:httpmime:4.3') 
  exclude module: "httpclient"  

您可以将上述对 build.gradle (Module:app) 的依赖项用于您的项目的以下 IMPORT 语句

导入 org.apache.http.entity.ContentType; 导入 org.apache.http.entity.mime.MIME;

【讨论】:

以上是关于Android Gradle 项目中包括 Apache HttpComponents 的问题的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 项目中包含 MPChartLib [重复]

你如何在android项目(gradle)中包含'com.google.protobuf'作为完整但不是精简版?

如何在Android主项目中包含库项目中使用的aar文件

在 Gradle 中为 Android 中的库项目构建变体

如何在 Android Studio 项目中将库添加到 Gradle 构建?

Gradle 脚本自动版本并在 Android 中包含提交哈希