我在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模块不允许我按预期使用该方法。
答案 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')}"
}
}