首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java.lang.NoClassDefFoundError:解析失败:Retrofit 2/Retrofit$Builder;

java.lang.NoClassDefFoundError:解析失败:Retrofit 2/Retrofit$Builder;
EN

Stack Overflow用户
提问于 2018-06-05 18:02:55
回答 4查看 3.1K关注 0票数 4

我正致力于在安卓系统中编写非常简单的基于Retrofit2的仪器测试(connectedTestAndroid任务)。

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

下面是我使用的代码示例:

代码语言:javascript
复制
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的输出,我还清除了关于同一位置不同版本的翻新的任何潜在问题。该应用程序不使用混淆或缩小,因为它只应该做一个网络请求。

代码语言:javascript
复制
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:

代码语言:javascript
复制
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
  }
}

通过反编译debug APK,我能够看到report2/retrofit2.class是不可用的。这是令人困惑的,因为根据我的理解,Dex‘’ing不应该影响它。

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

EN

回答 4

Stack Overflow用户

发布于 2018-06-05 18:27:11

NoClassDefFoundError错误表示找不到类的定义。它不同于NoClassFoundException

  • NoClassDefFoundError:JVM可以找到类,但是无法成功加载它。(初始化class)
  • NoClassFoundException时出现错误: JVM在类路径中找不到类。

NoClassDefFoundError总是在类初始化时发生。我建议您清理项目并检查Lretrofit2/Retrofit$Builder的初始化进程

希望这篇文章能帮助你Java understand NoClassDefFoundError

票数 4
EN

Stack Overflow用户

发布于 2019-03-28 21:14:29

对于我的情况,我只是清理和重建项目,这让我解决了这个问题。当您更改任何类名,但编译器仍然将先前的类名保留在缓存中,并且在运行时编译器无法找到先前存储的类名时,就会出现此异常。

票数 1
EN

Stack Overflow用户

发布于 2020-04-24 21:59:10

将此代码添加到应用程序的build.gradle中,在android {...}中:

代码语言:javascript
复制
compileOptions {
    sourceCompatibility 1.8
    targetCompatibility 1.8
}

然后清理并重新构建您的项目。这对我很管用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50697385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档