java - Gradle sourceCompatibility 对子项目没有影响

标签 java gradle compatibility bytecode

我的机器上安装了 Java 6 和 7。 Gradle 使用 1.7(使用 gradle -v 检查)。但我需要编译我的代码以与 Java 1.6 兼容。据我了解的文档,我可以使用 sourceCompatibility 属性来执行此操作(并且间接使用默认为 sourceCompatibilitytargetCompatibility)。

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

sourceCompatibility = 1.6

(确保我在一些试验中也添加了 targetCompatibility = 1.6,但这应该没有什么区别)

为了检查结果是否实际上与 1.6 兼容,我将生成的 jar cd 解压缩到 WEB-INF/classes 文件夹并使用 javap -verbose 在我遇到的第一个 .class 文件上。但是无论我设置目标兼容性还是使用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

更新 3: 我将构建的脚本更改为仅使用 java 插件(因此仅构建一些 jar)并删除了 warjettygwt 的使用> 插件。但是,尽管我在 allprojects 部分和一些子项目中设置了它,但所有项目仍然设置为 sourceCompatibility 1.7。现在在构建脚本中剩下的就是一些规范(maven,文件和其他子项目)的声明,要使用的存储库的声明,一些其他任务的声明(构建任务不依赖,所以它不应该受到影响)以及为创建的 jar 文件配置 list 文件(我在 list 文件中添加了规范和实现版本和标题)。

我看不出这会如何影响 sourceCompatibility 设置。

最佳答案

似乎这种行为是由指定 sourceCompatibility before apply plugin: 'java' 引起的,如果您尝试设置allprojects 中的兼容性选项。

在我的设置中,这种情况可以通过替换来解决:

allprojects {
    sourceCompatibility = 1.6
    targetCompatibility = 1.6
}

与:

allprojects {
    apply plugin: 'java'
    sourceCompatibility = 1.6
    targetCompatibility = 1.6
}

如果其他人可以在不同的设置中验证这一点,我会很高兴。

我仍然不确定这是否应该被报告为一个错误,但我相信这个解决方案比上面提到的解决方法更好(不过这很有帮助)。

关于java - Gradle sourceCompatibility 对子项目没有影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21028438/

相关文章:

java - 在 mouseMove 上设置 jLabel 的图标并随时间更改图像

Android Studio 和 Gradle : versionNameSuffix

android - 如何解决没有这样的属性:Gradle Version for classes :jetGradleplugin?

c++ - Visual Studio代码二进制兼容性

testing - IE8 向后兼容吗?

java - JDK7 中真的有 `ResultSet.getObject(String, Class<T>) 吗?

java - 日历功能

java - 在 java 中比较字符串 compareTo

java - 如何在 Jersey 中发布通用类型?

android - 保持 Android Studio 的特定依赖项顺序