升级到Java 17后Gradle构建报Unrecognized VM option 'CMSClassUnloadingEnabled'
Java17+Gradle7.3.1构建报错解决方案
报错1:Unrecognized VM option 'CMSClassUnloadingEnabled'
原因
CMS(Concurrent Mark Sweep)垃圾回收器从Java9开始被标记为废弃,Java14版本正式从JDK中移除,Java17环境下无法识别任何CMS相关的JVM参数。
解决方法
你已经删除了-XX:+CMSClassUnloadingEnabled参数,该步骤操作正确,第一个报错已处理完成。
报错2:Unable to make field private int java.lang.reflect.Field.modifiers accessible: module java.base does not "opens java.lang.reflect" to unnamed module
原因
Java9引入的JPMS(Java平台模块系统)对JDK内部API的反射访问做了强封装限制,Java17进一步收紧了默认权限,未模块化的代码(即运行在unnamed module下的代码)默认无法访问java.lang.reflect包下的私有属性。该报错通常是Gradle插件、项目依赖的第三方框架或业务代码中存在修改Field.modifiers属性的反射逻辑导致。
解决方法
- 首先修改
gradle.properties中的JVM参数配置,添加开包授权参数,修改后的完整配置如下:
org.gradle.jvmargs=-Dfile.encoding=UTF-8 -Xms1g -Xmx4g -XX:+UseG1GC --add-opens java.base/java.lang.reflect=ALL-UNNAMED
- 如果构建时编译环节或单元测试环节依然抛出同类报错,需要在
build.gradle中添加对应JVM参数:
Groovy DSL配置
// 编译环节添加参数 tasks.withType(JavaCompile) { options.fork = true options.forkOptions.jvmArgs += ['--add-opens', 'java.base/java.lang.reflect=ALL-UNNAMED'] } // 单元测试环节添加参数 test { jvmArgs '--add-opens', 'java.base/java.lang.reflect=ALL-UNNAMED' }
Kotlin DSL配置
// 编译环节添加参数 tasks.withType<JavaCompile> { options.isFork = true options.forkOptions.jvmArgs = listOf("--add-opens", "java.base/java.lang.reflect=ALL-UNNAMED") } // 单元测试环节添加参数 tasks.test { jvmArgs("--add-opens", "java.base/java.lang.reflect=ALL-UNNAMED") }
- 可选优化:如果项目依赖的旧版本框架(如ASM、CGLIB、Spring Boot 2.6以下版本等)不兼容Java17,建议优先升级对应框架到支持Java17的版本,从根源避免添加过多开包参数。
内容的提问来源于stack exchange,提问作者Wiktor Kęska
相关产品推荐
相关产品推荐

