java.lang.NoClassDefFoundError: Ошибка разрешения: Lretrofit2 / Retrofit $ Builder; - PullRequest
0 голосов
/ 05 июня 2018

Я работаю над написанием очень простых инструментальных тестов на основе Retrofit2 в Android (задача 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, я, естественно, пропустил эту зависимость.

Вот defaultConfig для моего приложения для 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 не был доступен.Это сбивает с толку, так как, насколько я понимаю, Дексинг не должен на это влиять.

Есть идеи, что может стать источником этой проблемы и решить в этом контексте?

Заранее спасибо,

Андреас.

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

Для моего случая я просто очищаю и перестраиваю проект , и это заставило меня решить эти проблемы.это исключение возникает, когда вы изменяете любое имя класса, но компилятор по-прежнему сохраняет предыдущее имя класса в кэше и во время выполнения компилятор не может найти ранее сохраненное имя класса, так как вы изменили имя позже.

0 голосов
/ 05 июня 2018

NoClassDefFoundError ошибка означает, что определение класса не найдено.Он отличается от NoClassFoundException.

  • NoClassDefFoundError: JVM может найти класс, но не может его успешно загрузить (что-то не так при инициализации класса)

  • NoClassFoundException: JVM не может найти класс в пути к классам.

NoClassDefFoundError всегда происходит во время инициализации класса.Я предлагаю вам очистить проект и проверить процесс инициализации Lretrofit2/Retrofit$Builder

Надеюсь, этот пост может помочь вам Java понять NoClassDefFoundError

...