Gradle构build错误:无法访问ITest错误的类文件:在版本50.0的classfile中findITest.class默认方法

我有一个奇怪的问题,不知道如何解决它。

我有一个默认方法的接口,像这样:

public interface ITest{ default String getText(){ return "ITest"; } } 

和实现这个接口的类,如下所示:

 public class TestClasssss implements ITest{ private String text; } 

我试图在我的应用程序unit testing项目中使用这个类。

所以,如果我复制这个类在我的android的unit testing项目里,它编译好了,所有工作如期,但如果这个类和接口声明在应用程序源文件夹,应用程序不编译和崩溃

 Error:(30, 10) error: cannot access ITest bad class file: ~\ITest.class default method found in version 50.0 classfile Please remove or make sure it appears in the correct subdirectory of the classpath. 

那么,我怎么能解决这个奇怪的行为?


我的分级configuration看起来像这样:

 buildscript { repositories { mavenCentral() } dependencies { classpath 'me.tatarka:gradle-retrolambda:3.2.5' } } repositories { mavenCentral() mavenLocal() maven { url = "https://oss.sonatype.org/content/repositories/snapshots/" } jcenter() } apply plugin: 'com.android.application' apply plugin: 'me.tatarka.retrolambda' apply plugin: 'realm-android' apply plugin: 'com.neenbedankt.android-apt' apt { arguments { androidManifestFile variant.outputs[0]?.processResources?.manifestFile } } android { compileSdkVersion 24 buildToolsVersion '24.0.1' defaultConfig { applicationId "io.projectname" targetSdkVersion 24 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { debuggable true minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt') } } testOptions { unitTests.returnDefaultValues = true } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } dataBinding { enabled = true } sourceSets { main { res.srcDirs = [ 'src/main/res/controls', 'src/main/res/fragments', 'src/main/res/activities', 'src/main/res/views', 'src/main/res' ] } } } ext { JUNIT_VERSION = '4.12' DAGGER_VERSION = '2.2' } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') testCompile 'junit:junit:4.12' testCompile 'org.mockito:mockito-core:2.0.111-beta' testCompile "org.robolectric:robolectric:3.1.1" compile 'com.android.support:appcompat-v7:24.2.0' compile 'com.android.support:design:24.2.0' compile 'com.roughike:bottom-bar:1.3.4' compile 'com.aurelhubert:ahbottomnavigation:1.2.3' compile 'joda-time:joda-time:2.9.4' compile 'com.annimon:stream:1.0.9' compile 'com.kyleduo.switchbutton:library:1.4.1' compile 'io.reactivex:rxandroid:1.2.0' compile 'io.reactivex:rxjava:1.1.5' compile 'com.jakewharton.rxbinding:rxbinding:0.4.0' compile('eu.davidea:flexible-adapter:5.0.0-SNAPSHOT') { changing = true } compile 'com.github.aakira:expandable-layout:1.5.1@aar' compile "cn.aigestudio.wheelpicker:WheelPicker:1.1.2" compile 'net.sf.biweekly:biweekly:0.5.0' //Dagger dependencies started compile "com.google.dagger:dagger:$DAGGER_VERSION" apt "com.google.dagger:dagger-compiler:$DAGGER_VERSION" provided 'javax.annotation:jsr250-api:1.0' compile 'javax.inject:javax.inject:1' testCompile "junit:junit:$JUNIT_VERSION" testApt "com.google.dagger:dagger-compiler:$DAGGER_VERSION" //Dagger dependencies finished provided 'org.projectlombok:lombok:1.16.10' } 

Solutions Collecting From Web of "Gradle构build错误:无法访问ITest错误的类文件:在版本50.0的classfile中findITest.class默认方法"

确保正确设置源和目标兼容性

 android { compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } 

我正在处理相同的问题,它似乎是Android上接受的编译的Java源代码版本与由retrolambda编译的代码生成的输出之间的某种冲突。 当您使用函数接口方法的default表示法时引发问题。 在retrolambda插件中有一些有限的支持,引用了repo( orfjackal / retrolambda )的自述文件:

retrolambda.defaultMethods是否在接口上回退默认方法和静态方法。 限制:所有后端接口和实现它们的所有类或调用它们的静态方法必须一起回溯,一次执行Retrolambda。 默认情况下禁用。 通过设置为“true”

所以你可以尝试在你的android模块的build.gradle文件中使用这个:

 ... android { ... } retrolambda { defaultMethods = true } 

在我的情况下,这是行不通的,但我的情况与你的情况完全不同。 我在一个库项目上使用retrolambda代码,然后尝试在另一个应用程序项目上使用它。

另外我无法使Jack&Jill编译器工作(这里有一些启用了Jack的java8支持,请参阅启用Java 8function以及 android引用中的Jack工具链 ),一个神秘的“NullPointer”引发./gradlew assembleDebug ,我build议现在避免jackOptions

祝你好运!

我认为你可能需要启用Jack编译器。 您需要以下内容:

  • Android Studio> 2.1
  • 默认方法只有在您定位API级别24 时才可用

你的gradle需要看起来像这样:

 android { ... defaultConfig { ... jackOptions { enabled true } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } 

这是Android文档中的Java 8语言function页面

你确定你的gradle build是使用jdk1.8 +吗? 这个版本似乎正在尝试利用1.8版本构build的类,而在使用较低版本构build时正在进行testing。

尝试:

 gradle clean build 

要么

 gradlew clean build 

如果您正在使用Android Studio,请尝试清理项目,然后再生成项目。 如果没有帮助,那么点击文件 – >“失效caching/重新启动”。 它必须帮助