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