我的机器上安装了Java 6和7。 Gradle使用1.7(使用gradle -v
进行检查)。但我需要编译我的代码以与Java 1.6兼容。据我了解的文件,我可以使用sourceCompatibility
属性(和间接targetCompatibility
默认为sourceCompatibility
)。Gradle sourceCompatibility对子项目没有影响
所以我添加下面一行到我的生成文件(根目录下,而不是在任何关闭):
sourceCompatibility = 1.6
(以确保我还添加了一些试验中targetCompatibility = 1.6
,但是这不应该有所作为)
要检查结果是否的确是与1.6兼容我解压得到的罐子,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: 我检查sourceCompatibility的设置在这个片段中相关的build.gradle文件:
compileJava.doFirst {
println "source compatibility " + sourceCompatibility
}
据透露,我sourceCompatibility设置为1.7,虽然我试图将其设置为1.6。当我提取最简单的子项目并自行构建时,sourceCompatibility设置正确,并且Java字节代码与1.6兼容。但是,即使这个子项目在多项目构建中使用了错误的sourceCompatibility。
BTW:我在一些子项目使用的插件是:java
,war
,jetty
,gwt
更新3: 我改变了内置的脚本只使用了Java插件(因此只构建一些罐子),并删除了war
,jetty
和gwt
插件的使用情况。但是,尽管我在allprojects
部分和一些子项目中进行了设置,但仍然将所有项目设置为sourceCompatibility 1.7。现在留在构建脚本中的所有内容是声明一些准则(maven,文件和其他子项目),声明要使用的存储库,声明其他一些任务(构建任务不依赖于,所以它不应该受到影响)以及为创建的jar文件配置清单文件(我向清单文件添加了规范和实现版本和标题)。
我看不出任何会影响sourceCompatibility设置。
为了满足您的需求,您需要设置'targetCompatibility'。但我不认为你可以有源代码compat>目标compat,并且你是对的,因为目标compat默认为源代码compat。因此,我希望这只是工作。这是一个多项目构建?你确定你为正确的项目设置了“sourceCompatibility”吗? –
另一种方法是使用Java 6运行Gradle。这也将捕获您无意中使用某些Java 7 API的情况,并避免每当您将Java 7编译器与源compat 6一起使用时发出恼人的javac警告,并且不要将编译器引导类路径上的Java 6标准库。 –
我完全重复你的步骤(也用JDK7运行Gradle),它对我来说工作得很好('主要版本:50')。在这一点上,它可能是你的构建的问题。例如,某些构建脚本或第三方插件可能会覆盖您的配置。但没有一个可重复的例子,很难再有进一步的帮助。你可以尝试的一件事是检查'compileJava.doFirst {println sourceCompatibility}'打印的内容。也尝试一个干净的版本,虽然它不应该是必要的。 –