Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.lang.NoClassDefFoundError:未能解析:Lretrofit2/Reformation$Builder;_Java_Android_Retrofit_Retrofit2_Dex - Fatal编程技术网

java.lang.NoClassDefFoundError:未能解析:Lretrofit2/Reformation$Builder;

java.lang.NoClassDefFoundError:未能解析:Lretrofit2/Reformation$Builder;,java,android,retrofit,retrofit2,dex,Java,Android,Retrofit,Retrofit2,Dex,我正致力于在Android中编写非常简单的基于改型2的仪器化测试(ConnectedStatandroid任务) 但是,由于上述短错误消息,我的测试失败 下面是我正在使用的代码示例: package com.example.app.android; import okhttp3.ResponseBody; import okhttp3.OkHttpClient; import java.util.concurrent.TimeUnit; import java.io.IOException;

我正致力于在Android中编写非常简单的基于改型2的仪器化测试(ConnectedStatandroid任务)

但是,由于上述短错误消息,我的测试失败

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

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);
      }
    };
  }
}
如果你好奇的话,是的,我正在对多个网络库做同样的事情。除非创建此版本,否则它们的存在不重要。以前,我也直接明确地依赖于OkHttp,但由于改型2依赖于它,我自然跳过了那个依赖

以下是我的android应用程序的defaultConfig:

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进行反编译,我可以看到Refundation2/Refundation.class不可用。这是令人困惑的,因为从我的理解来看,索引不应该影响它


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

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


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

  • NoClassFoundException
    :JVM在类路径中找不到类


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


希望这篇文章能帮助你

对于我的情况,我刚刚清理并重建了项目,这让我解决了这个问题。如果您更改了任何类名,但编译器仍将以前的类名保留在缓存中,并且在运行时编译器无法在您稍后更改名称时找到以前存储的类名,则会出现此异常。

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

compileOptions {
    sourceCompatibility 1.8
    targetCompatibility 1.8
}

然后清理并重建项目。这对我来说很有效。

问题在改型2.8.1中得到了解决。如果改型依赖性低于2.8.1,请将其升级到2.8.1

来自改装:

版本2.8.1(2020-03-25) 修复:不访问MethodHandles。在Android API 24和25上查找。这门课只有一节课 可在Android API 26及更高版本上获得


非常感谢您的链接,我现在对问题本身有了更好的理解,但是我仍然得到了这个例外,尽管我删除了所有的构建目录和.gradle目录。注意:Refught2不是我的代码,而是用于REST服务交互的第三方。如果它像这样被打破,那将是令人惊讶的,特别是因为它实际上与他们记录为最佳实践/示例的内容是相同的。我建议您清理项目并调试这个类,以查看在初始化这个类的过程中发生了什么错误。
compileOptions {
    sourceCompatibility 1.8
    targetCompatibility 1.8
}