我在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模块不允许我使用该方法,这与预期的一样。

最佳答案

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

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

Kotlin 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')}"
    }
}

10-04 12:39
查看更多