Java17下Spring Boot OAuth2资源服务器启动报defineClass空指针错误如何解决
问题原因
- 核心冲突为JAXB版本与Java 17的兼容性问题:Java 9及以上版本将原本内置的JAXB组件从JDK默认包中移除,你使用的Spring Boot 2.5.6内置的旧版本JAXB实现依赖反射访问JDK内部的
defineClass方法完成类注入,而Java 17新增了强封装限制,禁止非法反射访问JDK内部API,直接导致该方法初始化失败为空,触发空指针异常。 - 附加版本适配缺陷:Spring Boot 2.5.x系列未正式支持Java 17,官方对Java 17的兼容支持从Spring Boot 2.6.x版本才开始提供,旧版本的Spring Security OAuth2相关依赖在Java 17环境下运行本身也存在兼容性问题。
解决方案
方案一:升级Spring Boot版本(推荐)
将spring-boot-starter-parent版本升级到2.6.14及以上的2.6.x稳定版,同步将spring-cloud-dependencies版本升级到2021.0.x对应适配版本即可。Spring Boot 2.6.x官方已原生支持Java 17,且内置了兼容Java 17的JAXB相关依赖,无需额外修改其他配置即可解决该问题。
方案二:保留现有版本手动修复
如果暂时无法升级Spring Boot版本,可按以下步骤修改配置:
- 在项目pom.xml中引入兼容Java 17的JAXB依赖:
<dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.3.7</version> <scope>runtime</scope> </dependency> <dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> <version>2.3.3</version> </dependency>
- 在JVM启动参数中添加反射访问权限,启动应用时追加以下参数:
--add-opens java.base/java.lang=ALL-UNNAMED
内容的提问来源于stack exchange,提问作者kgajda
相关产品推荐
相关产品推荐

