我的机器上安装了Java 6和7。Gradle使用1.7(使用gradle -v
进行检查)。但我需要编译我的代码,使其与Java 1.6兼容。就我对文档的理解而言,我可以使用sourceCompatibility
属性(以及间接使用默认为sourceCompatibility
的targetCompatibility
)。
因此,我在构建文件中添加了以下行(在根级别,而不是在任何闭包中):
sourceCompatibility = 1.6
(可以肯定的是,我在一些试验中也添加了targetCompatibility = 1.6
,但这应该没有什么区别)
为了检查结果是否真的与1.6兼容,我将得到的jarcd
解压缩到WEB-INF/classes
文件夹中,并在遇到的第一个.class
文件中使用javap -verbose
。但是,无论我是设置了目标兼容性,还是使用1.5而不是1.6,或者我是否将其指定为字符串('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
UPDATE 3:我将构建的脚本更改为只使用java插件(因此只构建一些jar),并删除了war
、jetty
和gwt
插件的使用。但是,尽管我在allprojects
部分和一些子项目中设置了sourceCompatibility 1.7,但所有项目都设置为它。现在,构建脚本中只剩下一些decencies(maven、文件和其他子项目)的声明、要使用的存储库的声明,其他一些任务的声明(构建任务不依赖于这些任务,因此它不应该受到影响)以及为创建的jar文件配置清单文件(我为清单文件添加了一个规范、一个实现版本和标题)。
我看不出这些会对sourceCompatibility设置产生什么影响。
这种行为似乎是由在apply plugin: 'java'
之前指定sourceCompatibility
引起的,如果您试图在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 { ... }
块中。
如果使用sourceCompatibility或targetCompatibility,则需要在build.gradle文件中定义compileJava任务。如果没有compileJava任务,这两个兼容性变量在Intellij中都显示为未使用的变量。我使用的是Gradle 2.10版本。
要解决这个问题,只需检查构建Gradle(应用程序),并将以下代码放入其中。
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
同样在构建Gradle(项目)中,您必须具有以下代码。
allprojects {
repositories {
google()
mavenCentral()
jcenter()
sourceCompatibility = 1.6
targetCompatibility = 1.6
}
}