You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gradle中Java 9 --release标志不生效问题求助

解决JDK9+用--release 8编译Java8应用时的模块报错问题

我之前也踩过这个坑!你遇到的错误本质是:当项目中存在module-info.java文件时,哪怕指定了--release 8,JDK9+的javac编译器还是会尝试解析模块描述文件,但Java 8并不支持模块化系统,因此抛出了要求使用-source 9或更高版本的错误。

官方文档提到的“编译器忽略模块文件”其实是有前提的——只有当模块文件不在编译源范围内时,--release 8才会按Java 8的规则编译代码。如果module-info.java被包含在编译源里,javac还是会优先处理模块逻辑,导致冲突。

下面是几个可行的解决办法:

  • 直接移除module-info.java文件(最推荐)
    如果你的项目不需要针对JDK9+做模块化适配,只是想编译出能在Java 8环境运行的代码,直接删除module-info.java就可以彻底解决这个问题。Java 8完全不识别这个文件,留着反而会干扰编译流程。

  • 保留模块文件,配置Gradle跳过编译它
    如果你需要同时支持模块化(针对JDK9+)和非模块化(针对Java8)的场景,可以在Gradle中配置编译任务,让主代码编译时排除模块文件:

    tasks.withType(JavaCompile) {
        // 指定编译目标为Java 8
        options.compilerArgs.addAll(['--release', '8'])
        // 过滤掉module-info.java,不让javac处理它
        source = source.filter { !it.name.equals('module-info.java') }
    }
    
    // 可选:单独创建任务编译模块信息(针对JDK9+场景)
    task compileModuleInfo(type: JavaCompile) {
        source = fileTree('.').include('module-info.java')
        classpath = files()
        options.compilerArgs.addAll(['--release', '9'])
    }
    

    这样主代码会按Java 8的标准编译,模块信息则单独用JDK9的规则处理,互不干扰。

  • 升级Gradle版本
    部分旧版本的Gradle在处理JDK9+的--release参数和模块文件的兼容性上存在bug,建议升级到7.x及以上的稳定版本,能更好地处理这类跨版本编译的场景。

内容的提问来源于stack exchange,提问作者Wayneio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:18:07