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