渐变源兼容性对子项目没有影响



我的机器上安装了Java 6和7。Gradle使用1.7(使用gradle -v进行检查)。但我需要编译我的代码,使其与Java 1.6兼容。就我对文档的理解而言,我可以使用sourceCompatibility属性(以及间接使用默认为sourceCompatibilitytargetCompatibility)。

因此,我在构建文件中添加了以下行(在根级别,而不是在任何闭包中):

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:我在一些子项目中使用的插件是:javawarjettygwt

UPDATE 3:我将构建的脚本更改为只使用java插件(因此只构建一些jar),并删除了warjettygwt插件的使用。但是,尽管我在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
}
}

最新更新