Gradle sourceCompatibility对子项目没有影响

我的机器上安装了Java 6和7。 Gradle使用1.7(使用gradle -v进行检查)。 但是我需要编译我的代码来与Java 1.6兼容。 据我了解的文件,我可以使用sourceCompatibility属性来做到这一点(和间接的targetCompatibility默认为sourceCompatibility )。

所以我添加了以下行到我的构build文件(在根级别,而不是在任何封闭):

 sourceCompatibility = 1.6 

(可以肯定的是我还在一些试验中join了targetCompatibility = 1.6 ,但这不应该有所作为)

为了检查结果是否与1.6完全兼容,我将结果jar解压缩, cdWEB-INF/classes文件夹中,并在遇到的第一个.class文件上使用javap -verbose 。 但是不pipe是设置目标兼容性还是我使用1.5而不是1.6或者我是否指定了string( '1.6' ),每次javap的结果是

 minor version: 0 major version: 51 

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

任何想法,为什么sourceCompatibility不起作用? 或者是javap不正确的方法来检查兼容性?

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

 allprojects { sourceCompatibility = 1.6 targetCompatibility = 1.6 } 

但是这也没有帮助。

更新2:我检查了与相关的build.gradle文件中的这个代码片段的sourceCompatibility的设置:

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

它显示我的sourceCompatibility设置为1.7,尽pipe我试图将它设置为1.6。 当我提取最简单的子项目并自行构build时,sourceCompatibility设置正确,Java字节代码与1.6兼容。 但是,即使这个子项目在多项目构build中使用了错误的sourceCompatibility。

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

更新3:我改变了build立的脚本只使用Java插件(因此只是构build一些瓶子),并删除了warjettygwt插件的使用。 但是,尽pipe我在allprojects部分和一些子项目中设置了所有项目,但仍然将所有项目设置为sourceCompatibility 1.7。 所有现在留在构build脚本中的是声明一些准则(maven,文件和其他子项目),声明要使用的存储库,其他任务的声明(构build任务不依赖于,所以它不应该受到影响)和创build的jar文件清单文件的configuration(我添加一个清单文件的规范和实现版本和标题)。

我看不出有什么会影响sourceCompatibility设置。

看来这种行为是由于 apply plugin: 'java' 之前指定sourceCompatibility引起的apply plugin: 'java' ,如果你尝试在所有项目中设置兼容性选项,就会发生这种情况。

在我的设置中,情况可以通过replace来解决:

 allprojects { sourceCompatibility = 1.6 targetCompatibility = 1.6 } 

有:

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

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

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

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

作为一种解决方法,您可以在任务级别设置属性,

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

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

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