如何设置" sourceCompatibility"对于Kotlin和Gradle?

时间:2017-06-13 17:06:35

标签: java android gradle kotlin

我在Android应用上获得了java.lang.NoClassDefFoundError。我设法将问题隔离到List::replaceAll的调用。问题是该方法适用于Java 8,并且在某些设备中不可用,并且Kotlin / Gradle正在成功编译它。

类似问题:java.lang.NoClassDefFoundError $$inlined$forEach$lambda$1 in Kotlin

我的问题是。有没有办法在我的项目中使用Java 8 SDK时给出编译错误?我尝试手动设置Java 1.7,如下所示,但Java 8的代码编译成功。

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
    sourceCompatibility = JavaVersion.VERSION_1_7 // Is it even relevant here?
    targetCompatibility = JavaVersion.VERSION_1_7

    kotlinOptions {
        jvmTarget = "1.6"
    }
}

同样重要的是,代码不在Android模块中。我的Android模块不允许我按预期使用该方法。

1 个答案:

答案 0 :(得分:0)

我知道这是一个老问题,但仍然可以帮助其他人。

您遇到的问题是因为您实际上是针对jdk编译代码而不是目标。而且那个非常特别的jdk包含流API,因此可以正确编译。要实现目标,您必须针对目标jdk进行编译。

科特琳documentation为您提供jdkHome属性。因此您可以:

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
    kotlinOptions {
        jdkHome = 'target/jdk/home'
    }
}

要使解决方案与团队中的其他人兼容,您可以从local.properties文件加载路径,该文件不应位于vcs中:

Properties localProperties = new Properties()
localProperties.load(project.rootProject.file('local.properties').newDataInputStream())

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
    kotlinOptions {
        jdkHome = "${localProperties.getProperty('targetjdk.dir')}"
    }
}