调用JJWT的compact()生成JWT时触发java.lang.IllegalAccessException
解决JJWT在JDK20下调用compact()触发的模块访问异常
方案一:升级JJWT到最新兼容版本
JJWT 0.12.0版本在JDK17+的模块化环境下存在内部API访问问题,后续版本已修复该兼容性问题。将依赖升级到最新稳定版(如0.12.5)即可解决:
修改Gradle依赖配置:
implementation("io.jsonwebtoken:jjwt-api:0.12.5") runtimeOnly("io.jsonwebtoken:jjwt-impl:0.12.5") runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.12.5")
同步Gradle依赖后重新运行项目即可。
方案二:添加JVM参数允许内部API访问(临时方案)
如果暂时无法升级依赖,可通过添加JVM参数,让未命名模块访问java.base模块的sun.security.util包:
- IntelliJ IDEA运行配置:打开Run/Debug Configurations,在VM options中添加:
--add-opens java.base/sun.security.util=ALL-UNNAMED - Gradle运行配置:在
build.gradle中添加:tasks.withType(JavaExec) { jvmArgs += "--add-opens java.base/sun.security.util=ALL-UNNAMED" }
原因说明
JDK9及以上启用了模块化系统,sun.security.util属于java.base模块的内部API,默认不对外暴露给未命名模块。JJWT 0.12.0版本在处理密钥时调用了该内部类,触发了权限访问异常。升级版本可避免依赖内部API,添加参数则临时放开访问权限。
内容的提问来源于stack exchange,提问作者Meow17
相关产品推荐
相关产品推荐

