java.lang.NoClassDefFoundError : Failed resolution of: Lretrofit2/Retrofit$Builder;

标签 java android retrofit retrofit2 dex

我正在努力在 Android 中编写非常简单的基于 Retrofit2 的 Instrumented 测试(connectedTestAndroid 任务)。

由于上述简短的错误消息,我的测试失败了。

这是我正在使用的代码示例:

package com.example.app.android;

import okhttp3.ResponseBody;
import okhttp3.OkHttpClient;

import java.util.concurrent.TimeUnit;
import java.io.IOException;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import android.util.Log;

public class Retrofit2Requests extends BasicRequest
{
  private Call<ResponseBody> call;
  private OkHttpClient _client;
  private String _baseUrl;
  private Retrofit2Adapter _adapter;
  private static final String LOG_TAG = "RetroFit2Requests";

  public Retrofit2Requests (String baseUrl) throws Exception
  {
    _client = new OkHttpClient
      .Builder()
      .connectTimeout(TIME_SOCKET_TIMEOUT, TimeUnit.MILLISECONDS)
      .readTimeout(TIME_CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS)
      .build();
    _adapter = (Retrofit2Adapter) new Retrofit.Builder()
      .client(_client)
      .baseUrl(baseUrl)
      .build()
      .create(Retrofit2Adapter.class);
    _baseUrl = baseUrl;
  }

  public void getResponse(String data) throws IOException
  {
    Call<ResponseBody> call = _adapter.getDelayResponse(50, data);
    call.enqueue(getCallback());
  }

  private Callback getCallback()
  {
    return new Callback<ResponseBody>()
    {
      @Override
      public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response)
      {
        ResponseBody responseBody = (ResponseBody) response.body();

        Log.d(LOG_TAG, "ResponseBody: " + responseBody.toString());
      }

      @Override
      public void onFailure(Call<ResponseBody> call, Throwable t)
      {
        Log.e(LOG_TAG, "An exception occured fetchign response...", t);
      }
    };
  }
}

此代码的目标不是测试我的应用程序中的任何业务逻辑或任何特殊内容。它应该做的就是尝试一个请求,仅此而已。

这也是我的 Gradle 依赖项。基于 ./gradlew :app:dependencies 的输出也清除了我在同一位置进行不同版本改造的任何潜在问题。该应用程序不使用混淆或缩小,因为它只应该执行网络请求。

dependencies {    
    compile 'org.apache.httpcomponents:httpclient-android:4.3.5.1'
    compile 'com.mcxiaoke.volley:library:1.0.19'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    compile 'org.apache.commons:commons-lang3:3.7'
    compile 'com.squareup.retrofit2:retrofit:2.4.0'
    compile 'com.android.support:multidex:1.0.1'

    androidTestCompile 'org.hamcrest:hamcrest-library:1.3'
    androidTestCompile 'com.android.support.test:runner:0.5'
    androidTestCompile 'junit:junit:4.12'
}

如果您好奇,是的,我正在对多个网络库做同样的事情。除非创建此构建 NoClassDefFoundException,否则它们的存在应该无关紧要。以前,我也明确地直接依赖于 OkHttp,但由于 Retrofit2 依赖于它,所以我自然地跳过了该依赖项。

这是我的 Android 应用程序的默认配置:

defaultConfig {
  applicationId 'com.example.app.android'
  minSdkVersion 16
  targetSdkVersion 24
  testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        
  multiDexEnabled true

  dexOptions {
    preDexLibraries true
    javaMaxHeapSize '6g'
    incremental true
  }
}

通过反编译调试APK,我能够看到retrofit2/Retrofit.class不可用。这很令人困惑,因为根据我的理解,Dex'ing 不应该影响它。

您有什么想法可能是此问题的根源并在这种情况下解决吗?

最佳答案

NoClassDefFoundError 错误意味着找不到该类的定义。它与 NoClassFoundException 不同。

  • NoClassDefFoundError :JVM 可以找到该类,但无法成功加载它。(初始化类时出现错误)

  • NoClassFoundException:JVM 无法在类路径中找到该类。

NoClassDefFoundError 总是在类初始化期间发生。我建议你清理一下项目并检查Lretrofit2/Retrofit$Builder

的init进程

希望这篇文章可以帮助到您Java understand NoClassDefFoundError

关于java.lang.NoClassDefFoundError : Failed resolution of: Lretrofit2/Retrofit$Builder;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50697385/

相关文章:

java - 无法将 [$Proxy1] 类型的属性值转换为所需类型

android - Google Analytics v3 不显示实时数据

android - soundPool或Mediaplayer可获得短促的声音并需要帮助

android - RxJava 和 Retrofit 处理多个平面图的分页

java - Android如何使用retrofit传递模态类和参数数组

java - 设置 boolean 值是否需要临界区?

java - 如何阻止用户在 EditText 上输入特定字符

android - 无法在 Android XmlSerializer 中设置默认命名空间

java - 改造-IllegalArgumentException : unexpected url

java - 更好的 Java 方法语法?早归还是晚归?