Gradle 源代码兼容性对子项目没有影响

2022-08-31 14:40:16

我的计算机上安装了 Java 6 和 7。Gradle 使用 1.7(使用 检查)。但是我需要编译我的代码才能与Java 1.6兼容。据我所知,文档我可以使用该属性来执行此操作(并间接使用哪个默认值 )。gradle -vsourceCompatibilitytargetCompatibilitysourceCompatibility

因此,我将以下行添加到我的构建文件中(在根级别,而不是在任何闭包中):

sourceCompatibility = 1.6

(可以肯定的是,我也在一些试验中添加了,但这不应该有什么不同)targetCompatibility = 1.6

为了检查结果是否实际上与1.6兼容,我将生成的jar解压缩到文件夹中,并在我遇到的第一个文件上使用。但是,无论我是否设置了目标兼容性,或者我是否使用1.5而不是1.6,或者我是否将其指定为字符串(),每次javap的结果都是cdWEB-INF/classesjavap -verbose.class'1.6'

minor version: 0
major version: 51

Afaik这意味着它是Java 1.7字节码,这是错误的。

任何想法为什么 -设置不起作用?还是不是检查兼容性的正确方法?sourceCompatibilityjavap

更新:是的,这实际上是一个多项目构建,但我只检查了其中一个子项目的构建结果。在此子项目的构建文件中,我进行了上述更改,以确保它们实际应用。此外,我还在根项目的构建文件中添加了以下内容(@Vidya建议的那样):

allprojects {
    sourceCompatibility = 1.6
    targetCompatibility = 1.6
}

但这也无济于事。

更新 2:我在相关的 build.gradle 文件中检查了源代码兼容性与此代码段的设置:

compileJava.doFirst {
    println "source compatibility " + sourceCompatibility
}

它显示我的源代码兼容性设置为1.7,尽管我试图将其设置为1.6。当我提取最简单的子项目并自行构建时,源代码兼容性设置正确,Java字节代码与1.6兼容。但是,即使此子项目在多项目生成中使用时也使用错误的源兼容性。

顺便说一句:我在一些子项目中使用的插件是:,,,,javawarjettygwt

更新 3:我将构建的脚本更改为仅使用java插件(因此只是构造一些jar),并删除了和插件的使用。但是,尽管我在本节和一些子项目中设置了它,但所有项目仍然设置为sourceCompatibility 1.7。现在,在构建脚本中剩下的只是一些属性(maven,文件和其他子项目)的声明,要使用的存储库的声明,其他一些任务的声明(构建任务不依赖于这些任务,因此它不应该受到影响)以及创建的jar文件的清单文件的配置(我向清单文件添加了规范和实现版本和标题)。warjettygwtallprojects

我看不出这些会如何影响源兼容性设置。


答案 1

似乎此行为是由指定 before 引起的,如果您尝试在 中设置兼容性选项,则会发生这种情况。sourceCompatibilityapply plugin: 'java'allprojects

在我的设置中,可以通过替换以下代码来解决这种情况:

allprojects {
    sourceCompatibility = 1.6
    targetCompatibility = 1.6
}

跟:

allprojects {
    apply plugin: 'java'
    sourceCompatibility = 1.6
    targetCompatibility = 1.6
}

如果其他人可以在不同的设置中验证这一点,将会很高兴。

我仍然不确定这是否应该报告为错误,但我相信这个解决方案比上面提到的解决方法更好(但是这很有帮助)。


答案 2

症状表明有人在某个地方覆盖 。但鉴于有很多方法可以自定义Gradle,我无法从远处说出那是谁。project.sourceCompatibility

作为一种解决方法,您可以在任务级别设置属性,这最终很重要:

tasks.withType(JavaCompile) { 
    sourceCompatibility = "1.6"
    targetCompatibility = "1.6" 
}

将其添加到阻止。allProjects { ... }


推荐