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解压缩, cd
到WEB-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。
顺便说一句:我在一些子项目中使用的插件是: java
, war
, jetty
, gwt
更新3:我改变了build立的脚本只使用Java插件(因此只是构build一些瓶子),并删除了war
, jetty
和gwt
插件的使用。 但是,尽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。