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

升级到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属性的反射逻辑导致。

解决方法

  1. 首先修改gradle.properties中的JVM参数配置,添加开包授权参数,修改后的完整配置如下:
org.gradle.jvmargs=-Dfile.encoding=UTF-8 -Xms1g -Xmx4g -XX:+UseG1GC --add-opens java.base/java.lang.reflect=ALL-UNNAMED
  1. 如果构建时编译环节或单元测试环节依然抛出同类报错,需要在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")
}
  1. 可选优化:如果项目依赖的旧版本框架(如ASM、CGLIB、Spring Boot 2.6以下版本等)不兼容Java17,建议优先升级对应框架到支持Java17的版本,从根源避免添加过多开包参数。

内容的提问来源于stack exchange,提问作者Wiktor Kęska

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 12:39:02