我在 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 编译代码,而这不是您的目标。并且该非常特殊的 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')}"
}
}
我是一名优秀的程序员,十分优秀!