Gradle sourceCompatibility对子项目没有影响

 rtsnance 发布于 2023-02-04 18:56

我的机器上安装了Java 6和7.Gradle使用1.7(使用检查gradle -v).但我需要编译我的代码以与Java 1.6兼容.据我所知文档,我可以使用该sourceCompatibility属性(并间接targetCompatibility默认为 sourceCompatibility).

所以我将以下行添加到我的构建文件中(在根级别,而不是在任何闭包中):

sourceCompatibility = 1.6

(可以肯定的是,我也在targetCompatibility = 1.6一些试验中添加了,但这不应该有所作为)

要检查结果是否与1.6实际兼容,我将生成的jar解压缩cdWEB-INF/classes文件夹中,并javap -verbose.class我遇到的第一个文件中使用.但无论我是设置目标兼容性还是我使用1.5而不是1.6或者我是否将其指定为string('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插件(因此只建造了一些罐子),除去的使用war,jettygwt插件.但是仍然所有项目都设置为sourceCompatibility 1.7尽管我在allprojects部分和一些子项目中设置它.现在在构建脚本中留下的所有内容都是一些decencies(maven,文件和其他子项目)的声明,要使用的存储库的声明,一些其他任务的声明(构建任务不依赖于,所以它不应该受到影响)和创建的jar文件的清单文件的配置(我向清单文件添加规范和实现版本和标题).

我没有看到其中任何一个会影响sourceCompatibility设置.

2 个回答
  • 看来这种行为是由指定sourceCompatibility before 引起的apply plugin: 'java',如果您尝试在其中设置兼容性选项,则会发生这种情况allprojects.

    在我的设置中,可以通过替换以下方式解决问题:

    allprojects {
        sourceCompatibility = 1.6
        targetCompatibility = 1.6
    }
    

    有:

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

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

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

    2023-02-04 18:58 回答
  • 症状表明有人覆盖了某个地方project.sourceCompatibility.但鉴于有很多方法可以自定义Gradle,我无法从远处说出那是谁.

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

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

    将此添加到allProjects { ... }阻止.

    2023-02-04 18:58 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有