我有一个奇怪的问题,不知道如何解决它。
我有一个默认方法的接口,如下所示:
public interface ITest{
default String getText(){
return "ITest";
}
}
和实现此接口的类,如下所示:
public class TestClasssss implements ITest{
private String text;
}
我试图在我的应用单元测试项目中使用这个类。
所以,如果我在我的android的单元测试项目中复制这个类,它编译好了,并且所有工作都按预期工作,但是如果这个类和接口在app源文件夹中声明,则应用程序不会编译并崩溃
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.
那么,我怎么能解决这个奇怪的行为?
我的graddle配置如下所示:
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'
}
答案 0 :(得分:1)
确保正确设置source and target兼容性
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
答案 1 :(得分:1)
我正在处理同样的问题,它似乎是在android上接受的已编译java源代码与用retrolambda编译的代码生成的输出之间的某种冲突。
当您对函数接口方法使用default
表示法时,问题会出现。
在retrolambda插件中有一些有限的支持,引用了repo的自述文件(orfjackal/retrolambda):
retrolambda.defaultMethods 是否在接口上反向移植默认方法和静态方法。 限制:所有后向接口和所有实现的类 他们或称他们的静态方法必须一起向后移植, 一次执行Retrolambda。 默认情况下禁用。通过设置为" true"
启用
因此,您可以在Android模块的build.gradle
文件中尝试使用它:
...
android {
...
}
retrolambda {
defaultMethods = true
}
在我的情况下,这不起作用,但我的情况与你的完全不同。我在一个库项目上使用了retrolambda代码,然后尝试在另一个应用程序项目中使用它。
此外,我无法得到杰克& Jill编译器工作(启用了Jack的某种java8支持,请参阅android引用中的Enable Java 8 Features and the Jack Toolchain),一个神秘的" NullPointer"提升到./gradlew assembleDebug
,因此我建议暂时不要使用jackOptions
。
答案 2 :(得分:0)
我认为您可能需要启用Jack
编译器。您需要以下内容:
你的gradle需要看起来像这样:
android {
...
defaultConfig {
...
jackOptions {
enabled true
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
答案 3 :(得分:0)
使用dex2jar后出现此问题。根据{{3}},JVM字节码的版本50表示Java 1.6,而我的dex文件设计为在版本52(1.8)上运行。我使用了另一个dex2jar实用程序(该程序可以在任何jar上运行,而不仅仅是dex),可以将版本更改为1.8。源位于https://gitlab.ow2.org/asm/asm/blob/master/asm/src/main/java/org/objectweb/asm/Opcodes.java#L264,命令为d2j-class-version-switch.sh 8 <source jar> <destination jar>
。
答案 4 :(得分:-1)
你确定你的gradle构建使用的是jdk1.8 +吗?似乎构建试图利用使用1.8构建的类,但在使用较低版本的构建期间进行测试。
尝试:
gradle clean build
OR
gradlew clean build
答案 5 :(得分:-1)
如果您使用的是Android Studio,请尝试清理项目,然后编译项目。如果它也没有帮助,那么点击文件 - &gt; &#34;使缓存无效/重新启动&#34;。它必须帮助