2014-01-09 76 views
45

我的机器上安装了Java 6和7。 Gradle使用1.7(使用gradle -v进行检查)。但我需要编译我的代码以与Java 1.6兼容。据我了解的文件,我可以使用sourceCompatibility属性(和间接targetCompatibility默认为sourceCompatibility)。Gradle sourceCompatibility对子项目没有影响

所以我添加下面一行到我的生成文件(根目录下,而不是在任何关闭):

sourceCompatibility = 1.6 

(以确保我还添加了一些试验中targetCompatibility = 1.6,但是这不应该有所作为)

要检查结果是否的确是与1.6兼容我解压得到的罐子,cdWEB-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:我在一些子项目使用的插件是:javawarjettygwt

更新3: 我改变了内置的脚本只使用了Java插件(因此只构建一些罐子),并删除了war,jettygwt插件的使用情况。但是,尽管我在allprojects部分和一些子项目中进行了设置,但仍然将所有项目设置为sourceCompatibility 1.7。现在留在构建脚本中的所有内容是声明一些准则(maven,文件和其他子项目),声明要使用的存储库,声明其他一些任务(构建任务不依赖于,所以它不应该受到影响)以及为创建的jar文件配置清单文件(我向清单文件添加了规范和实现版本和标题)。

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

+0

为了满足您的需求,您需要设置'targetCompatibility'。但我不认为你可以有源代码compat>目标compat,并且你是对的,因为目标compat默认为源代码compat。因此,我希望这只是工作。这是一个多项目构建?你确定你为正确的项目设置了“sourceCompatibility”吗? –

+0

另一种方法是使用Java 6运行Gradle。这也将捕获您无意中使用某些Java 7 API的情况,并避免每当您将Java 7编译器与源compat 6一起使用时发出恼人的javac警告,并且不要将编译器引导类路径上的Java 6标准库。 –

+1

我完全重复你的步骤(也用JDK7运行Gradle),它对我来说工作得很好('主要版本:50')。在这一点上,它可能是你的构建的问题。例如,某些构建脚本或第三方插件可能会覆盖您的配置。但没有一个可重复的例子,很难再有进一步的帮助。你可以尝试的一件事是检查'compileJava.doFirst {println sourceCompatibility}'打印的内容。也尝试一个干净的版本,虽然它不应该是必要的。 –

回答

67

看来这种行为是通过指定引起前apply plugin: 'java',如果你尝试将兼容性选项设置里面allprojects这恰好sourceCompatibility

在我的设置,这种情况可以通过更换得到解决:

allprojects { 
    sourceCompatibility = 1.6 
    targetCompatibility = 1.6 
} 

有:

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

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

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

+0

好的。第一个片段是错误的,因为这些属性仅由'java'插件引入。在1.x中,它将给出关于将值分配给不存在的属性的弃用警告,在2.0中它将彻底失败。 –

+0

我们刚刚与我的同事讨论这个“警告”主题。出于某种原因,代码没有发出警告(Gradle 1.8和1.12)。我仍然不清楚为什么。 – Marwin

+0

如果在应用'java'插件之前设置了'sourceCompatibility',那么肯定会发出以下弃用警告:''''根据项目'foo'“,弃用动态属性:”sourceCompatibility“,值:”1.6“。' –

38

症状表明某处有人覆盖project.sourceCompatibility。但鉴于有很多方法来定制Gradle,我无法从远处说出那是谁。

作为一种变通方法,您可以在任务的水平,这是最终计数设置属性:

tasks.withType(JavaCompile) { 
    sourceCompatibility = "1.6" 
    targetCompatibility = "1.6" 
} 

一下添加到allProjects { ... }块。

+0

今天我们遇到了同样的情况。这是一个很好的解决方法,我仍然很好奇导致sourceCompatibility设置被覆盖的原因。 – Marwin

+0

是否带括号? “” –

1

如果您使用sourceCompatibility或targetCompatibility,则需要在build.gradle文件中定义compileJava任务。如果没有compileJava任务,两个兼容性变量在Intellij中显示为未使用的变量。我正在使用Gradle版本2.10。