Java 如何设置;sourceCompatibility“;为了科特林和格拉德尔?

Java 如何设置;sourceCompatibility“;为了科特林和格拉德尔?,java,android,gradle,kotlin,Java,Android,Gradle,Kotlin,我在Android应用程序上得到了java.lang.NoClassDefFoundError。我设法把这个问题孤立起来,打电话给他。问题是该方法适用于Java8,在某些设备中不可用,Kotlin/Gradle正在成功编译该方法 tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { sourceCompatibility = JavaVersion.VERSION_1_7 // Is it even r

我在Android应用程序上得到了
java.lang.NoClassDefFoundError
。我设法把这个问题孤立起来,打电话给他。问题是该方法适用于Java8,在某些设备中不可用,Kotlin/Gradle正在成功编译该方法

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"
    }
}
类似问题:

我的问题是。当我在项目中使用Java8SDK时,有没有办法给我一个编译错误?我曾尝试像下面这样手动设置Java1.7,但使用Java8的代码编译成功

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不是您的目标。而且非常特殊的jdk包含流API,因此可以正确编译。为了实现目标,必须针对目标jdk进行编译

Kotlin为您提供
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')}"
    }
}

不确定是否相关。但是您使用的是哪个stdlib依赖项?它应该是
kotlin-stdlib
kotlin-stdlib-jre7
,而不是
kotlin-stdlib-jre8
@hotkey我正在使用
kotlin-stdlib
,但即使使用
kotlin-stdlib-jre7
,我也能够用Java8SDK编译代码。