【问题标题】:Android Studio: Unirest-Java Could not find class 'org.apache.http.impl.client.CloseableHttpClient'Android Studio:Unirest-Java 找不到类 'org.apache.http.impl.client.CloseableHttpClient'
【发布时间】:2015-01-24 02:59:11
【问题描述】:

我正在尝试创建一个谷歌眼镜应用程序,该应用程序使用 CamFind api 来识别来自相机的对象。我已经安装了 maven,但它不会组装“主 jar”,所以我将依赖项添加到 gradle 构建路径。我已经让它编译没有任何错误(假设有 8 个警告),但它不会在没有错误的情况下完成对 api 的调用。

以下是相关代码:

包 com.akqa.glass.recipie;

import android.util.Log;

import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.JsonNode;
import com.mashape.unirest.http.Unirest;
import com.mashape.unirest.http.exceptions.UnirestException;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;

//    For if I'm using Unirest - don't it's not working...

    //import org.apache.http.HttpResponse;
    //import org.shaded.apache.http.HttpHeaders;

    public class JSONParser {
        static InputStream is = null;
        static JSONObject jObj = null;
        static String json = "";
        private static final String TAG = JSONParser.class.getSimpleName();
        // constructor
        public JSONParser() {
        }
        public JSONObject getCamFindJSON(String type, String input) {
            Log.d("PARSER", "Inside Parser");
            /*
             *  Request processing from API
             */
            if(type == "request"){
                try {
                    HttpResponse<JsonNode> response = Unirest.post("https://camfind.p.mashape.com/image_requests")
                    .header("X-Mashape-Key", "Fhn5jZi5ixmshwnJMy7CGyj5yDCnp15DTQZjsniuwpVHfYHvFJ")
                    .field("image_request[image]", new File(input))
                    .field("image_request[locale]", "en_US")
                    .asJson();
                } catch (UnirestException e) {
                    e.printStackTrace();
                }
            }
            /*
             *  Receive response from API
             */
            else if(type == "response"){
                // These code snippets use an open-source library. http://unirest.io/java
                try {
                    HttpResponse<JsonNode> response = Unirest.get("https://camfind.p.mashape.com/image_responses/" + input)
                    .header("X-Mashape-Key", "Fhn5jZi5ixmshwnJMy7CGyj5yDCnp15DTQZjsniuwpVHfYHvFJ")
                    .asJson();
                } catch (UnirestException e) {
                    e.printStackTrace();
                }
            }
            /*
             *  Parse Response into readable JSON
             */
            try {
                BufferedReader reader = new BufferedReader(new InputStreamReader(
                        is, "iso-8859-1"), 8);
                StringBuilder sb = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                    sb.append(line + "n");
                    Log.d("Raw Data", line);
                }
                is.close();
                json = sb.toString();
            } catch (Exception e) {
                Log.e("Buffer Error", "Error converting result " + e.toString());
            }
            // try parse the string to a JSON object
            try {
                jObj = new JSONObject(json);
            } catch (JSONException e) {
                Log.e("JSON Parser", "Error parsing data " + e.toString());
                e.printStackTrace();
            } catch (Exception e) {
                Log.e("JSON Parse", "Unknown Error");
                e.printStackTrace();
            }
            // return JSON String
            return jObj;
        }
    }

这里是相关的 gradle 构建路径:

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

    dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')
        compile files('C:/Users/torti_000/Documents/Recip.ie/libs/unirest-java-1.3.26.jar')
        compile 'org.apache.httpcomponents:httpclient:4.3.5'
    //    compile 'org.apache.httpcomponents:httpclient-android:4.3.3'
        compile 'org.apache.httpcomponents:httpmime:4.3.5'
        compile 'org.apache.httpcomponents:httpasyncclient:4.0.2'
    }

最后,这是 logcat 的输出(我很确定这是导致所有问题的第一行):

11-25 14:21:59.589    6847-7099/com.akqa.glass.recipie E/dalvikvm﹕ Could not find class 'org.apache.http.impl.client.CloseableHttpClient', referenced from method com.mashape.unirest.http.Unirest.shutdown
11-25 14:21:59.589    6847-7099/com.akqa.glass.recipie W/dalvikvm﹕ VFY: unable to resolve check-cast 451 (Lorg/apache/http/impl/client/CloseableHttpClient;) in Lcom/mashape/unirest/http/Unirest;
11-25 14:21:59.589    6847-7099/com.akqa.glass.recipie D/dalvikvm﹕ VFY: replacing opcode 0x1f at 0x0006
11-25 14:21:59.605    6847-7099/com.akqa.glass.recipie I/dalvikvm﹕ Could not find method org.apache.http.client.methods.HttpRequestBase.releaseConnection, referenced from method com.mashape.unirest.http.HttpClientHelper.request
11-25 14:21:59.605    6847-7099/com.akqa.glass.recipie W/dalvikvm﹕ VFY: unable to resolve virtual method 1095: Lorg/apache/http/client/methods/HttpRequestBase;.releaseConnection ()V
11-25 14:21:59.605    6847-7099/com.akqa.glass.recipie D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x0012
11-25 14:21:59.605    6847-7099/com.akqa.glass.recipie I/dalvikvm﹕ Could not find method org.apache.http.client.methods.HttpRequestBase.releaseConnection, referenced from method com.mashape.unirest.http.HttpClientHelper.request
11-25 14:21:59.605    6847-7099/com.akqa.glass.recipie W/dalvikvm﹕ VFY: unable to resolve virtual method 1095: Lorg/apache/http/client/methods/HttpRequestBase;.releaseConnection ()V
11-25 14:21:59.605    6847-7099/com.akqa.glass.recipie D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x0021
11-25 14:21:59.613    6847-7099/com.akqa.glass.recipie I/dalvikvm﹕ Could not find method org.apache.http.client.config.RequestConfig.custom, referenced from method com.mashape.unirest.http.options.Options.refresh
11-25 14:21:59.613    6847-7099/com.akqa.glass.recipie W/dalvikvm﹕ VFY: unable to resolve static method 1069: Lorg/apache/http/client/config/RequestConfig;.custom ()Lorg/apache/http/client/config/RequestConfig$Builder;
11-25 14:21:59.613    6847-7099/com.akqa.glass.recipie D/dalvikvm﹕ VFY: replacing opcode 0x71 at 0x0020
11-25 14:21:59.613    6847-7099/com.akqa.glass.recipie D/dalvikvm﹕ DexOpt: unable to opt direct call 0x070c at 0x49 in Lcom/mashape/unirest/http/options/Options;.refresh
11-25 14:21:59.613    6847-7099/com.akqa.glass.recipie W/dalvikvm﹕ Exception Ljava/lang/NoClassDefFoundError; thrown while initializing Lcom/mashape/unirest/http/options/Options;
11-25 14:21:59.620    6847-7099/com.akqa.glass.recipie W/dalvikvm﹕ threadid=11: thread exiting with uncaught exception (group=0x4162bbd8)
11-25 14:21:59.620    6847-7101/com.akqa.glass.recipie D/PARSER﹕ Inside Parser
11-25 14:21:59.620    6847-7101/com.akqa.glass.recipie I/dalvikvm﹕ Rejecting re-init on previously-failed class Lcom/mashape/unirest/http/options/Options; v=0x0
11-25 14:21:59.620    6847-7099/com.akqa.glass.recipie E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
    Process: com.akqa.glass.recipie, PID: 6847
    java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:314)
            at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
            at java.util.concurrent.FutureTask.run(FutureTask.java:242)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:240)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)
     Caused by: java.lang.NoClassDefFoundError: org.apache.http.client.config.RequestConfig
            at com.mashape.unirest.http.options.Options.refresh(Options.java:45)
            at com.mashape.unirest.http.options.Options.<clinit>(Options.java:34)
            at com.mashape.unirest.http.HttpClientHelper.prepareRequest(HttpClientHelper.java:153)
            at com.mashape.unirest.http.HttpClientHelper.request(HttpClientHelper.java:133)
            at com.mashape.unirest.request.BaseRequest.asJson(BaseRequest.java:68)
            at com.akqa.glass.recipie.JSONParser.getCamFindJSON(JSONParser.java:42)
            at com.akqa.glass.recipie.RecipIE$CamFindRequest.doInBackground(RecipIE.java:288)
            at com.akqa.glass.recipie.RecipIE$CamFindRequest.doInBackground(RecipIE.java:275)
            at android.os.AsyncTask$2.call(AsyncTask.java:302)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:240)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)
11-25 14:21:59.628    6847-7101/com.akqa.glass.recipie W/dalvikvm﹕ threadid=12: thread exiting with uncaught exception (group=0x4162bbd8)
11-25 14:21:59.628    6847-7101/com.akqa.glass.recipie I/Process﹕ Sending signal. PID: 6847 SIG: 9

【问题讨论】:

  • Android 上的 Apache Http 总是有问题的,因为 Android 内部有一个残缺的版本,它被加载而不是您在 apk 中发布的版本。 Android http 库通常重命名其包名称中的 apache 库以解决该问题。 blog.mashape.com/using-unirest-java-for-your-android-projects 似乎解释了如何为这个项目解决这个问题。
  • @zapl 他们对使用 maven 进行“超级 jav”的解释是可行的,但是他们的代码存在问题并且无法汇编。在这一点上,我正试图找到一种方法来做到这一点,而不会感到不安。
  • 正是@zapl。我听过几个人谈论改造,但没有调查过。看起来是个不错的选择。
  • 两者的优势在于它们是为 Android 设计的,并且了解线程模型和 Apache 问题等特殊性。 volley 更通用一点,可以像下载 REST 一样下载图像,改造是专门为 REST 设计的,让这变得超级简单。

标签: java android google-glass android-gradle-plugin unirest


【解决方案1】:

解决这个问题的方法是按照说明将所有依赖项编译到巨型 jar 中。我做不到,所以我改用改造。稍后我将通过博客文章的链接更新此内容,该链接是关于如何将改造与 Mashape API 一起使用。

【讨论】:

  • 你能分享一下如何使用 mashape api 进行改造。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-01
  • 2012-08-19
  • 2011-12-01
相关资源
最近更新 更多