2016-08-30 15 views
16

Tôi có vấn đề lạ và không biết cách giải quyết nó.Lỗi xây dựng Gradle: không thể truy cập tệp lớp tồi tệ nhất ITest: phương thức mặc định ITest.class được tìm thấy trong phiên bản 50.0 classfile

Tôi có một giao diện với phương pháp mặc định, như thế này:

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

và lớp mà thực hiện giao diện này, như thế này:

public class TestClasssss implements ITest{ 
    private String text; 
} 

Và tôi cố gắng sử dụng lớp này bên trong đơn vị ứng dụng của tôi dự án thử nghiệm.

Vì vậy, nếu tôi sao chép các lớp học này bên trong dự án đơn vị thử nghiệm Android của tôi nó biên dịch ok và tất cả làm việc như mong đợi, tuy nhiên nếu lớp này và giao diện khai báo trong thư mục nguồn ứng dụng, ứng dụng không biên dịch và va chạm với

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. 

Vì vậy, làm cách nào để khắc phục hành vi kỳ lạ này?


cấu hình graddle của tôi trông như thế này:

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:[email protected]' 
    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' 
} 
+0

Mã này không biên dịch chỉ khi TestClassss được sử dụng trong các thử nghiệm, nếu bạn xóa nó khỏi biên dịch dự án thử nghiệm một cách chính xác, tôi có đúng không? – Ph0en1x

+0

Với ví dụ giả này - vâng, đúng vậy. Nhưng trong trường hợp thực sự nó không thành công chỉ khi tôi cố gắng truy cập các phương thức từ giao diện hoặc nếu cố gắng tạo ra một mô hình cho những lớp đó. –

+1

@silent_coder Bạn có sử dụng retrolambda trong dự án của mình không? –

Trả lời

-1

Bạn có chắc chắn rằng xây dựng gradle bạn đang sử dụng jdk1.8 +? Nó có vẻ như xây dựng đang cố gắng sử dụng một lớp học được xây dựng bằng cách sử dụng 1.8 nhưng đang được thử nghiệm trong quá trình xây dựng bằng cách sử dụng một phiên bản thấp hơn.

thử:

gradle clean build 

HOẶC

gradlew clean build 
+0

Vâng, có vẻ lạ. Lệnh của bạn hoạt động giống như các bản dựng android thông thường và không khắc phục được sự cố. Nó không thành công trên: ứng dụng: compileDebugUnitTestJavaWithJavac ' –

-1

Nếu bạn đang sử dụng Android Studio cố gắng làm sạch dự án, sau đó xây dựng dự án. Nếu nó không giúp quá, sau đó Click to File -> "Invalid Caches/Restart". Nó phải giúp

+0

Unfortunatelly, điều này không giúp đỡ. –

1

Hãy chắc chắn rằng bạn đã thiết lập source and target tương thích một cách chính xác

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

Tôi có các cài đặt đó. –

+0

@silent_coder là sự cố của bạn có thể tái tạo trong cả hai dòng lệnh android studio và gradle? – vsminkov

+0

có, nó được sao chép trong cả hai –

0

Tôi nghĩ rằng có lẽ bạn cần phải kích hoạt trình biên dịch Jack. Bạn cần những điều sau đây:

  • Android Studio> 2.1
  • phương pháp mặc định chỉ có sẵn nếu bạn là Nhắm mục tiêu API Cấp 24

gradle của bạn cần phải tìm kiếm một cái gì đó như thế này:

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

Đây là Java 8 Language Feature Page in the Android Documentation

+0

Tại sao nó được biên dịch mà không có vấn đề trong môi trường không kiểm tra? –

1

Tôi đã xử lý cùng một vấn đề, có vẻ như có một số loại xung đột giữa phiên bản nguồn java được biên dịch được chấp nhận trên Android và đầu ra được tạo ra bởi mã được biên dịch bằng retrolambda. Sự cố tăng lên khi bạn sử dụng ký hiệu default cho phương thức giao diện funcional. Có một số loại hỗ trợ hạn chế cho rằng trong các plugin retrolambda, trích dẫn readme của 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"

Vì vậy, bạn có thể thử sử dụng này trong tập tin build.gradle mô-đun android của bạn:

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

Trong trường hợp của tôi điều này không hoạt động, nhưng kịch bản của tôi khá khác với kịch bản của bạn. Tôi đã có mã retrolambda trên một dự án thư viện và sau đó cố gắng sử dụng nó trên một dự án ứng dụng khác.

Ngoài ra tôi không thể có được trình biên dịch Jack & Jill làm việc (theres một số loại hỗ trợ java8 với Jack kích hoạt, xem Enable Java 8 Features and the Jack Toolchain tại tham khảo android), một trong những bí ẩn "NullPointer" tăng tại ./gradlew assembleDebug, vì vậy tôi đề nghị để tránh jackOptions cho hiện nay.

Chúc may mắn!

Các vấn đề liên quan