使用 Kotlin 和 Gradle 定位特定的 JVM

Target specific JVM with Kotlin and Gradle

有什么区别

java {
    sourceCompatibility = JavaVersion.VERSION_11
    targetCompatibility = JavaVersion.VERSION_11
}

compileKotlin {
    kotlinOptions {
        jvmTarget = "11"
    }
}

他们会在 gradle/Kotlin-library 中达到相同的最终结果吗? jvmTarget 是为了设置使用哪个标准库版本,我明白了。

kotlinOptions.jvmTarget 用于指定 JVM 标准库的版本,用作编译 JVM 特定的 Kotlin 源集的依赖项(参见 javac 的 https://kotlinlang.org/docs/gradle.html#dependency-on-the-standard-library and -bootclasspath 选项).

java.sourceCompatibility 确保 .java 文件使用指定版本的 Java 编程语言语法

java.targetCompatibility 确保生成的 .class 文件与指定的 JVM

兼容

因此,这些选项并不等同。

无论如何,定义交叉编译参数的现代(自 Gradle 6.7+ 和 Kotlin 1.5.30+)方式是 toolchain:

kotlin {
    jvmToolchain {
        (this as JavaToolchainSpec).languageVersion.set(JavaLanguageVersion.of(11))
    }
}

// Or its eqivalent:

java {
    toolchain {
        languageVersion.set(JavaLanguageVersion.of(11))
    }
}