Gradle sourceCompatibility对子项目无效
我的机器上安装了Java 6和7。Gradle使用1.7(使用选中gradle -v
)。但是我需要编译代码以与Java
1.6兼容。据我了解的文档,我可以使用sourceCompatibility
属性来实现(并间接使用targetCompatibility
,默认为
sourceCompatibility
)。
因此,我将以下行添加到了我的构建文件中(在根级别,而不是在任何闭包中):
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: 0major version: 51
Afaik这意味着它是Java 1.7字节码,这是错误的。
有什么想法为什么sourceCompatibility
设置无效?还是javap
检查兼容性的正确方法?
是的,这实际上是一个多项目的构建,但是我只检查了一个子项目的构建结果。在此子项目的构建文件中,我进行了提及的更改,以确保它们确实被应用。另外,我在根项目的构建文件中添加了以下内容(也建议使用@Vidya):
allprojects { sourceCompatibility = 1.6
targetCompatibility = 1.6
}
但这也无济于事。
我在相关的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
我改变了内置的脚本只使用了Java插件(因此只建造了一些罐子),除去的使用war
,jetty
和gwt
插件。但是尽管我在本allprojects
节和某些子项目中进行了设置,但仍将所有项目都设置为sourceCompatibility
1.7
。现在,构建脚本中只剩下一些声明(Maven,文件和其他子项目),要使用的存储库的声明,其他一些任务的声明(构建任务不依赖于,因此不应该受到影响)以及为所创建的jar文件配置清单文件的方式(我向清单文件添加了规范,实现版本和标题)。
我看不到有什么会影响sourceCompatibility设置。
回答:
似乎此行为是由指定sourceCompatibility
before 引起的apply plugin:
'java',如果尝试在其中设置兼容性选项,则会发生这种情况allprojects
。
在我的设置中,可以通过以下方法解决此问题:
allprojects { sourceCompatibility = 1.6
targetCompatibility = 1.6
}
与:
allprojects { apply plugin: 'java'
sourceCompatibility = 1.6
targetCompatibility = 1.6
}
如果其他人可以在其他设置中对此进行验证,我们将非常高兴。
我仍然不确定是否应该将其报告为错误,但我相信此解决方案比上述解决方法更好(但是,它非常有帮助)。
以上是 Gradle sourceCompatibility对子项目无效 的全部内容, 来源链接: utcz.com/qa/430109.html