Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Gradle build error: cannot access ITest bad class file: ITest.class default method found in version 50.0 classfile

I have strange problem and don't know how to resolve it.

I have an interface with default method, like this:

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

and class which implements this interface, like this:

public class TestClasssss implements ITest{
    private String text;
}

And I trying to use this class inside my app unit tests project.

So, if I copy this classes inside my android's unit test project it compiles ok and all working as expected, however if this class and interface declared in app source folder, application do not compile and crash with

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.

So, how could I fix this strange behaviour?


My graddle config looks like this:

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'
}
like image 313
silent_coder Avatar asked Aug 30 '16 13:08

silent_coder


People also ask

Does Gradle support Java 18?

A Java version between 8 and 18 is required to execute Gradle. Java 19 and later versions are not yet supported.

What version of Java does Gradle use?

Gradle can only run on Java version 8 or higher. Gradle still supports compiling, testing, generating Javadoc and executing applications for Java 6 and Java 7.

How do I find my Gradle version?

In Android Studio, go to File > Project Structure. Then select the "project" tab on the left. Your Gradle version will be displayed here.

How does Gradle work?

Gradle is a build automation tool known for its flexibility to build software. A build automation tool is used to automate the creation of applications. The building process includes compiling, linking, and packaging the code. The process becomes more consistent with the help of build automation tools.


2 Answers

Make sure that you set up source and target compatibility correctly

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
like image 165
vsminkov Avatar answered Oct 18 '22 18:10

vsminkov


I was dealing with the same issue, it appears to be some kind of conflict between the compiled java source version accepted on android and the output produced by the code compiled with retrolambda. The problem raises when you use the default notation for funcional interfaces method. There's some kind of limited support for that in the retrolambda plugin, quoting the readme of the repo (orfjackal/retrolambda):

retrolambda.defaultMethods Whether to backport default methods and static methods on interfaces. LIMITATIONS: All backported interfaces and all classes which implement them or call their static methods must be backported together, with one execution of Retrolambda. Disabled by default. Enable by setting to "true"

So you can try using this in your android module's build.gradle file:

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

In my case this does not work, but my scenario was quite different than yours. I was having the retrolambda code on one library project and then trying to use that on another app project.

Also I could not get the Jack & Jill compiler to work (theres some kind of java8 support with Jack enabled, see Enable Java 8 Features and the Jack Toolchain at android reference), one cryptic "NullPointer" raises at ./gradlew assembleDebug, so I suggest to avoid jackOptions for now.

Good luck!

like image 44
Fernando Jascovich Avatar answered Oct 18 '22 18:10

Fernando Jascovich