JDK11升级到17后Javassist 3.28.0-GA调用CtClass#toClass报错如何解决
JDK17升级后Javassist 3.28.0-GA调用CtClass#toClass报错解决方案
该报错是JDK17强化了模块化访问限制,默认不允许未命名模块反射访问java.base模块下java.lang包的非公开方法导致的,Javassist 3.28版本的内部实现仍依赖反射调用ClassLoader的defineClass方法,因此触发权限拦截。可行解决方案如下:
方案1:升级Javassist至兼容版本(优先推荐)
Javassist从3.29.0-GA版本开始正式适配JDK17的访问规则,移除了对非法反射访问的依赖,直接升级依赖版本即可解决问题,无需额外配置。
Maven依赖配置参考:<dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.29.0-GA</version> </dependency>Gradle依赖配置参考:
implementation 'org.javassist:javassist:3.29.0-GA'方案2:添加JVM启动参数临时兼容
若受项目约束暂时无法升级Javassist版本,可以在JVM启动参数中添加如下配置,开放对应包的反射访问权限:--add-opens java.base/java.lang=ALL-UNNAMEDJar包运行时启动命令示例:
java --add-opens java.base/java.lang=ALL-UNNAMED -jar your-application.jar注意:该方案会降低JDK模块化的安全防护能力,仅建议作为临时过渡方案使用。
方案3:模块化项目专属配置
若你的项目是JDK9+的模块化项目(根目录存在module-info.java文件),可以直接在模块描述文件中添加如下配置,单独为Javassist开放访问权限:opens java.lang to javassist;
内容的提问来源于stack exchange,提问作者marthursson
相关产品推荐
相关产品推荐

