Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Gradle sourceCompatibility对子项目没有影响_Java_Gradle_Compatibility_Bytecode - Fatal编程技术网

Java Gradle sourceCompatibility对子项目没有影响

Java Gradle sourceCompatibility对子项目没有影响,java,gradle,compatibility,bytecode,Java,Gradle,Compatibility,Bytecode,我的机器上安装了Java6和Java7。Gradle使用1.7(使用Gradle-v进行检查)。但是我需要编译代码以与Java1.6兼容。就我对文档的理解而言,我可以使用sourceCompatibility属性(间接使用默认为sourceCompatibility的targetCompatibility) 因此,我在构建文件中添加了以下行(在根级别,而不是在任何闭包中): (当然,我在一些试验中也添加了targetCompatibility=1.6,但这不会有什么不同) 为了检查结果是否与1.

我的机器上安装了Java6和Java7。Gradle使用1.7(使用
Gradle-v
进行检查)。但是我需要编译代码以与Java1.6兼容。就我对文档的理解而言,我可以使用
sourceCompatibility
属性(间接使用默认为
sourceCompatibility
targetCompatibility

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

(当然,我在一些试验中也添加了
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这意味着它是Java1.7字节码,这是错误的

你知道为什么
sourceCompatibility
-设置不起作用吗?还是
javap
不是检查兼容性的正确方法

更新: 是的,这实际上是一个多项目构建,但我只检查了一个子项目的构建结果。在这个子项目的构建文件中,我做了上面提到的更改,以确保它们被实际应用。此外,我在根项目的构建文件中添加了以下内容(正如@Vidya所建议的):

但这也没用

更新2: 我在相关build.gradle文件中检查了sourceCompatibility与此代码段的设置:

compileJava.doFirst {
    println "source compatibility " + sourceCompatibility
}
它显示我的sourceCompatibility设置为1.7,尽管我尝试将其设置为1.6。当我提取最简单的子项目并自行内置时,sourceCompatibility设置正确,Java字节码与1.6兼容。但是,在多项目生成中使用时,即使是此子项目也使用了错误的sourceCompatibility

顺便说一句:我在一些子项目中使用的插件是:
java
war
jetty
gwt

更新3: 我将构建的脚本更改为只使用java插件(因此只构建一些JAR),并删除了
war
jetty
gwt
插件的使用。尽管我在
allprojects
部分和一些子项目中设置了sourceCompatibility 1.7,但所有项目都设置为sourceCompatibility 1.7。构建脚本中现在剩下的就是一些核心(maven、文件和其他子项目)的声明、要使用的存储库的声明、一些其他任务的声明(构建任务不依赖于这些任务,因此不应该受到影响)以及所创建jar文件的清单文件的配置(我向清单文件添加了一个规范、一个实现版本和标题)


我看不出这会对sourceCompatibility设置产生什么影响。

症状表明有人在某个地方覆盖了project.sourceCompatibility。但考虑到定制Gradle的方法有很多,我无法从远处说出是谁

作为一种解决方法,您可以在任务级别上设置属性,这是最重要的:

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

将此添加到
allProjects{…}
块。

此行为似乎是由于在
apply plugin:'java'
之前指定
sourceCompatibility
而导致的,如果您尝试在
allProjects
中设置兼容性选项,则会发生这种情况

在我的设置中,可以通过更换以下部件来解决此问题:

allprojects {
    sourceCompatibility = 1.6
    targetCompatibility = 1.6
}
与:

如果其他人可以在不同的设置中验证这一点,我们将非常高兴


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

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

要满足您的要求,您需要设置
targetCompatibility
。但是我不认为您可以使用source compat>target compat,您的观点是正确的,target compat默认为source compat。因此,我希望这可以正常工作。这是一个多项目构建吗?您确定要为正确的项目设置
sourceCompatibility
?另一种方法是使用Java 6运行Gradle。这也会捕获以下情况:在这里,您无意中使用了一些Java 7 API,避免了在使用源代码compat 6的Java 7编译器时发出的恼人的Java C警告,并且没有将Java 6标准库放在编译器的引导类路径上。我完全重复了您的步骤(也使用JDK7运行Gradle),这对我来说很好(
主要版本:50
)。此时可能是您的构建有问题。例如,某些构建脚本或第三方插件可能会覆盖您的配置。但如果没有可复制的示例,则很难进一步提供帮助。您可以尝试检查
compileJava.doFirst{println sourceCompatibility}
打印。也可以尝试使用干净的构建,尽管这不是必需的。它打印的是
compileJava.sourceCompatibility
,默认为
project.sourceCompatibility
(这是您到目前为止一直在设置的)。您可以尝试设置任务级属性(这些是最重要的属性)直接使用
任务。使用类型(JavaCompile){sourceCompatibility=“1.6”;targetCompatibility=“1.6”}
,虽然通常不需要这样做。@PeterNiederwieser我添加了这个

tasks.withType(JavaCompile) { 
    sourceCompatibility = "1.6"
    targetCompatibility = "1.6" 
}
allprojects {
    sourceCompatibility = 1.6
    targetCompatibility = 1.6
}
allprojects {
    apply plugin: 'java'
    sourceCompatibility = 1.6
    targetCompatibility = 1.6
}