我的机器上安装了Java 6和7.Gradle使用1.7(使用检查gradle -v
).但我需要编译我的代码以与Java 1.6兼容.据我所知文档,我可以使用该sourceCompatibility
属性(并间接targetCompatibility
默认为 sourceCompatibility
).
所以我将以下行添加到我的构建文件中(在根级别,而不是在任何闭包中):
sourceCompatibility = 1.6
(可以肯定的是,我也在targetCompatibility = 1.6
一些试验中添加了,但这不应该有所作为)
要检查结果是否与1.6实际兼容,我将生成的jar解压缩cd
到WEB-INF/classes
文件夹中,并javap -verbose
在.class
我遇到的第一个文件中使用.但无论我是设置目标兼容性还是我使用1.5而不是1.6或者我是否将其指定为string('1.6'
),每次javap的结果是
minor version: 0 major version: 51
Afaik这意味着它是Java 1.7字节码,这是错误的.
有什么想法sourceCompatibility
- 设置不起作用?或者javap
不是检查兼容性的正确方法?
更新: 是的,这实际上是一个多项目构建,但我只检查了一个子项目的构建结果.在这个子项目的构建文件中,我做了上述更改,以确保它们实际应用.另外,我在根项目的构建文件中添加了以下内容(如@Vidya所提议的那样):
allprojects { sourceCompatibility = 1.6 targetCompatibility = 1.6 }
但这也没有帮助.
更新2: 我在相关的build.gradle文件中使用此代码片段检查了sourceCompatibility的设置:
compileJava.doFirst { println "source compatibility " + sourceCompatibility }
它显示我的sourceCompatibility设置为1.7,虽然我试图将其设置为1.6.当我提取最简单的子项目并自行构建时,sourceCompatibility设置正确,Java Byte代码与1.6兼容.但是,即使这个子项目在多项目构建中使用时也使用了错误的sourceCompatibility.
BTW:我在一些子项目使用的插件是:java
,war
,jetty
,gwt
更新3:
我改变了内置的脚本只使用了Java插件(因此只建造了一些罐子),除去的使用war
,jetty
和gwt
插件.但是仍然所有项目都设置为sourceCompatibility 1.7尽管我在allprojects
部分和一些子项目中设置它.现在在构建脚本中留下的所有内容都是一些decencies(maven,文件和其他子项目)的声明,要使用的存储库的声明,一些其他任务的声明(构建任务不依赖于,所以它不应该受到影响)和创建的jar文件的清单文件的配置(我向清单文件添加规范和实现版本和标题).
我没有看到其中任何一个会影响sourceCompatibility设置.
看来这种行为是由指定sourceCompatibility
before 引起的apply plugin: 'java'
,如果您尝试在其中设置兼容性选项,则会发生这种情况allprojects
.
在我的设置中,可以通过替换以下方式解决问题:
allprojects { sourceCompatibility = 1.6 targetCompatibility = 1.6 }
有:
allprojects { apply plugin: 'java' sourceCompatibility = 1.6 targetCompatibility = 1.6 }
如果其他人可以在不同的设置中验证这一点,将会很高兴.
我仍然不确定这是否应该被报告为错误,但我相信这个解决方案比上面提到的解决方案更好(但这非常有帮助).
症状表明有人覆盖了某个地方project.sourceCompatibility
.但鉴于有很多方法可以自定义Gradle,我无法从远处说出那是谁.
作为一种变通方法,您可以在任务级别设置属性,这最终是最重要的:
tasks.withType(JavaCompile) { sourceCompatibility = "1.6" targetCompatibility = "1.6" }
将此添加到allProjects { ... }
阻止.