Gradle sourceCompatibility对子项目没有影响

时间:2014-01-09 18:38:05

标签: java gradle compatibility bytecode

我的机器上安装了Java 6和7。 Gradle使用1.7(使用gradle -v检查)。但我需要编译我的代码以与Java 1.6兼容。据我理解的文档,我可以使用sourceCompatibility属性来执行此操作(并间接使用默认为targetCompatibility的{​​{1}}。

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

sourceCompatibility

(我确定在某些试验中我也添加了sourceCompatibility = 1.6 ,但这不应该有所作为)

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

'1.6'

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

为什么minor version: 0 major version: 51 - 设置不起作用的任何想法?或者sourceCompatibility不是检查兼容性的正确方法吗?

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

javap

但这也无济于事。

更新2: 我在相关的build.gradle文件中检查了sourceCompatibility的设置:

allprojects {
    sourceCompatibility = 1.6
    targetCompatibility = 1.6
}

它显示我的sourceCompatibility设置为1.7,尽管我尝试将其设置为1.6。当我提取最简单的子项目并自行构建时,sourceCompatibility设置正确,Java Byte代码与1.6兼容。但是,即使这个子项目在多项目构建中使用时也会使用错误的sourceCompatibility。

BTW:我在一些子项目中使用的插件有:compileJava.doFirst { println "source compatibility " + sourceCompatibility } javawarjetty

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

我没有看到其中任何一个会影响sourceCompatibility设置。

3 个答案:

答案 0 :(得分:79)

这似乎是由于在 sourceCompatibility之前指定apply plugin: 'java' 导致此行为,如果您尝试在allprojects内设置兼容性选项,则会发生这种情况。

在我的设置中,可以通过替换:

来解决问题
allprojects {
    sourceCompatibility = 1.6
    targetCompatibility = 1.6
}

使用:

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

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

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

答案 1 :(得分:45)

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

作为一种变通方法,您可以在任务级别设置属性,这是最终的重要性:

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

将此添加到allProjects { ... }块。

答案 2 :(得分:1)

如果使用sourceCompatibility或targetCompatibility,则需要在build.gradle文件中定义compileJava任务。如果没有compileJava任务,两个兼容性变量在Intellij中显示为未使用的变量。我使用的是Gradle版本2.10。