我的机器上安装了 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
文件夹并使用 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:我在一些子项目中使用的插件有:java
、war
、jetty
、gwt
更新 3:
我将构建的脚本更改为仅使用 java 插件(因此仅构建一些 jar)并删除了 war
、jetty
和 gwt
的使用> 插件。但是,尽管我在 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/