修改Gradle版本后出现path_provider编译失败报错该如何解决?
问题产生原因
- 该错误是Java 9及以上版本引入的JPMS(Java平台模块系统)访问限制导致的,本质是你升级后的Gradle版本与当前使用的JDK版本不兼容
- Gradle内部的
org.gradle.internal.compiler.java.ClassNameCollector类需要调用JDKjdk.compiler模块下的非公开APIcom.sun.tools.javac.code.Symbol$TypeSymbol,而高版本JDK默认禁止未命名模块(即Gradle的类所属的模块)访问未主动导出的JDK内部包,因此直接抛出访问异常 - 本次报错触发在
path_provider依赖的编译环节,也可能同时存在该第三方依赖版本与当前项目Gradle/AGP版本不匹配的问题
修复方案
你可以根据自己的项目情况选择以下任意一种方案:
- 匹配Gradle与JDK的兼容版本
参照Gradle官方的版本兼容规则调整你的开发环境:
- 若你使用JDK 1618,对应Gradle版本需要升级到7.47.6.4
- 若你使用JDK 1920,对应Gradle版本需要升级到8.08.3
- 若不想升级Gradle,也可以直接将JDK降级到对应Gradle版本支持的范围即可
- 添加JVM参数绕过模块访问限制
无需修改环境版本,直接在项目根目录的gradle.properties文件中添加如下配置即可:
org.gradle.jvmargs=--add-exports jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED --add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED
该配置会主动将JDK对应内部包导出给所有未命名模块访问,直接绕过模块隔离限制。
升级第三方依赖版本
如果是Flutter项目使用的path_provider依赖触发的报错,直接将该依赖升级到最新稳定版即可,新版本已经适配了高版本Gradle和JDK的编译规则,不会触发该类访问错误。匹配AGP与Gradle版本
如果是Android项目,还需要保证Android Gradle插件(AGP)版本与Gradle版本的对应关系:
- AGP 7.0.x 对应 Gradle 7.0+
- AGP 7.4.x 对应 Gradle 7.5+
- AGP 8.0.x 对应 Gradle 8.0+
- AGP 8.2.x 对应 Gradle 8.2+
版本不匹配也会触发该类内部API访问错误,调整到对应版本即可解决问题。
内容的提问来源于stack exchange,提问作者Mohammed Mazen
相关产品推荐
相关产品推荐

