Gradle 如何设置语言级别? (所以它是 IDE-不可知论者)

How to set the language level in Gradle ? (so it is IDE-agnostic)

我想以 IDE 不可知的方式在 gradle 中设置 java 语言级别。

sourceCompatibility = 1.x 在根级别似乎已在 Gradle 2.21 中弃用。

(编辑:是吗?IntelliJ 给我一个 groovy 检查错误)

所以我找到了这个,它有效。

idea {
    project {
        languageLevel = '1.7'
    }
}

但是这里的配置不会将 gradle 绑定到 IntelliJ IDEA,因为 idea { } 结构...

有没有办法以 IDE 不可知的方式做到这一点?

我希望我的 gradle 构建脚本在 any IDE 中 运行(无论是 IntelliJ IDEA 还是Eclipse)或 Jenkins(或其他)。

显示了为 CLI 构建执行此操作的方法。但是我不确定是否每个 IDE 都会选择它。

allprojects {
    tasks.withType(JavaCompile) {
        sourceCompatibility = '1.7'
        targetCompatibility = '1.7'
    } 
}

如果您在命令行中使用 Gradle,语言级别可以正常工作,如 build.gradle 文件中指定的那样。

但是当导入Gradle java项目到IntelliJ IDEA时,Gradle的插件负责生成IDEA的项目设置文件,

不幸的是,插件不尊重 build.gradle 的 sourceCompatibility/targetCompatibility 属性, 相反,它使用 IDEA 的设置: File -> Other Settings -> Default Project Structure -> Project Language Level -> 6 (By default).

所以,我认为这是 gradle 的 idea 插件的一个错误。见 https://issues.gradle.org/browse/GRADLE-2198

目前,我有时不得不在上面的对话框中更改语言级别。

如果它们是在 compileJava 下定义的,您将不会收到警告并且 IntelliJ 和 gradle 都遵守它。

compileJava {
    sourceCompatibility = '1.7'
    targetCompatibility = '1.7'
}

与任何 gradle 文件更改一样,您需要同步才能让 IntelliJ 获取更改。

在您的 build.gradle 应用模块的 android 闭包内部:

android {
    compileSdkVersion 27
    buildToolsVersion "26.0.2"
    // etc
    // other things

    // add this
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

添加这个作为答案,因为我从评论中得到它:

不要在 compileJava 任务中使用 sourceCompatibility/targetCompatibility,而是使用:

project.sourceCompatibility = '1.7'
project.targetCompatibility = '1.7'

在相关项目的配置中

我在 Gradle 6.1 上测试了以下内容并且有效:

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