【发布时间】:2014-01-28 11:44:02
【问题描述】:
我的机器上安装了 Java 6 和 7。 Gradle 使用 1.7(使用 gradle -v 检查)。但我需要编译我的代码以与 Java 1.6 兼容。据我了解的文档,我可以使用sourceCompatibility 属性来执行此操作(间接使用默认为sourceCompatibility 的targetCompatibility)。
所以我在我的构建文件中添加了以下行(在根级别,而不是在任何闭包中):
sourceCompatibility = 1.6
(确保我在一些试验中也添加了targetCompatibility = 1.6,但这应该没有什么区别)
为了检查结果是否实际上与 1.6 兼容,我将生成的 jar cd 解压缩到 WEB-INF/classes 文件夹中,并在遇到的第一个 .class 文件上使用了 javap -verbose。但是无论我设置目标兼容性还是使用1.5而不是1.6还是指定为字符串('1.6'),每次javap的结果都是
minor version: 0
major version: 51
Afaik 这意味着它是 Java 1.7 字节码,这是错误的。
任何想法为什么sourceCompatibility-setting 不起作用?还是javap不是检查兼容性的正确方法?
更新: 是的,这实际上是一个多项目构建,但我只检查了其中一个子项目的构建结果。在这个子项目的构建文件中,我进行了上述更改以确保它们被实际应用。此外,我在根项目的构建文件中添加了以下内容(正如@Vidya 建议的那样):
allprojects {
sourceCompatibility = 1.6
targetCompatibility = 1.6
}
但这也无济于事。
更新 2: 我在相关的 build.gradle 文件中用这个 sn-p 检查了 sourceCompatibility 的设置:
compileJava.doFirst {
println "source compatibility " + sourceCompatibility
}
它显示我的 sourceCompatibility 设置为 1.7,尽管我尝试将其设置为 1.6。当我提取最简单的子项目并自行构建时,sourceCompatibility 设置正确,Java Byte 代码与 1.6 兼容。但是,即使这个子项目在多项目构建中使用时也使用了错误的 sourceCompatibility。
顺便说一句:我在一些子项目中使用的插件是:java、war、jetty、gwt
更新 3:
我将构建的脚本更改为仅使用 java 插件(因此仅构建一些 jar)并删除了 war、jetty 和 gwt 插件的使用。但是,尽管我在allprojects 部分和一些子项目中设置了它,但所有项目仍然设置为 sourceCompatibility 1.7。现在在构建脚本中只剩下一些规范(maven、文件和其他子项目)的声明,要使用的存储库的声明,一些其他任务的声明(构建任务不依赖于,所以它不应该受到影响)以及为创建的 jar 文件配置清单文件(我在清单文件中添加了规范和实现版本和标题)。
我看不出这会如何影响 sourceCompatibility 设置。
【问题讨论】:
-
为了满足您的要求,您需要设置
targetCompatibility。但是我认为您不能拥有源兼容性>目标兼容性,并且您的目标兼容性默认为源兼容性。因此,我希望这能正常工作。这是一个多项目构建吗?您确定为正确的项目设置sourceCompatibility? -
另一种方法是使用 Java 6 运行 Gradle。这也将捕获您无意中使用某些 Java 7 API 的情况,并避免每当您将 Java 7 编译器与源代码兼容时发出的恼人的 javac 警告6 并且不要将 Java 6 标准库放在编译器的引导类路径中。
-
我完全重复了你的步骤(也使用 JDK7 运行 Gradle),它对我来说很好用 (
major version: 50)。此时很可能是您的构建有问题。例如,某些构建脚本或第三方插件可能会覆盖您的配置。但是如果没有可重复的例子,就很难再提供帮助。您可以尝试的一件事是检查compileJava.doFirst { println sourceCompatibility }打印的内容。也尝试使用干净的构建,尽管这不是必需的。 -
它正在打印
compileJava.sourceCompatibility,默认为project.sourceCompatibility(这是您迄今为止设置的)。您可以尝试直接使用tasks.withType(JavaCompile) { sourceCompatibility = "1.6"; targetCompatibility = "1.6" }设置任务级属性(这些是最重要的属性),尽管通常没有必要这样做。 -
@PeterNiederwieser 我将这个
tasks.withType(JavaCompile) { sourceCompatibility = "1.6"; targetCompatibility = "1.6" }添加到allProjects{},它现在可以工作了。即使使用原始构建脚本中的所有插件。如果您将此添加为答案,我会接受。不过,我仍然很好奇为什么它不能通过项目属性起作用。
标签: java gradle compatibility bytecode