Spring Boot OAuth2授权服务器启动报PrivilegedActionException异常
报错核心触发原因为JDK版本与旧版Spring Security OAuth2依赖的jaxb-impl版本不兼容。
旧版jaxb-impl-2.3.0.1.jar通过反射调用JDK内部API sun.misc.Unsafe.defineClass实现类加载逻辑,该API在JDK9及以上版本中被移除/方法签名变更,反射调用时直接抛出NoSuchMethodException,连锁导致JWT令牌转换器初始化失败,最终造成springSecurityFilterChain Bean创建失败,Spring容器初始化终止。
你贴出的业务代码、配置本身无逻辑错误,问题本质是依赖兼容性:参考教程默认基于JDK8环境编写,若本地使用JDK9+(含JDK11、JDK17等常用LTS版本)就会触发该异常。
- 优先确认项目运行的JDK版本:执行
java -version查看版本号,若版本号≥9,优先定位为依赖兼容问题 - 校验JAXB依赖版本:Maven项目执行
mvn dependency:tree | findstr jaxb(Windows)/mvn dependency:tree | grep jaxb(Mac/Linux),Gradle项目执行./gradlew dependencies | grep jaxb,确认依赖树中是否存在2.3.0.1版本的jaxb-impl、jaxb-core包 - 最后校验证书有效性:确认resources目录下
ssia.jks文件存在,配置的存储密码、密钥别名与生成证书时的参数一致(证书配置错误不会抛出Unsafe相关异常,可放在最后验证)
二选一即可,优先根据你的JDK使用需求选择:
方案1:切换JDK版本至1.8(零代码修改适配教程)
教程本身基于JDK8环境开发,直接将项目编译、运行环境切换为JDK8即可直接启动,无需修改任何代码或依赖。
Maven项目可在pom.xml中明确指定编译版本,避免环境不一致:
<properties> <java.version>1.8</java.version> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties>
方案2:保留高版本JDK,升级JAXB依赖(生产环境推荐)
如果需要使用JDK11及以上版本,无需降级JDK,只需要升级JAXB相关依赖到兼容高版本JDK的版本,替换掉传递依赖引入的2.3.0.1旧版本即可。
Maven项目在pom.xml中添加如下依赖:
<!-- JAXB API --> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> <!-- JAXB 实现,升级到兼容JDK9+的版本 --> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.3.3</version> </dependency> <!-- 排除旧版jaxb-core的不兼容依赖 --> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> <version>2.3.0.1</version> <exclusions> <exclusion> <groupId>com.sun.activation</groupId> <artifactId>javax.activation</artifactId> </exclusion> </exclusions> </dependency> <!-- 补充activation依赖 --> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency>
Gradle项目在build.gradle中添加如下依赖:
implementation 'javax.xml.bind:jaxb-api:2.3.1' implementation 'com.sun.xml.bind:jaxb-impl:2.3.3' implementation('com.sun.xml.bind:jaxb-core:2.3.0.1') { exclude group: 'com.sun.activation', module: 'javax.activation' } implementation 'javax.activation:activation:1.1.1'
添加依赖后刷新依赖包,重新启动项目即可。
证书校验补充
如果完成上述操作后仍启动失败,可通过keytool命令校验JKS证书有效性:
keytool -list -v -keystore ssia.jks -storepass ssia123
命令正常输出证书别名、有效期信息则证书无问题;如果命令报错,可重新生成证书,将生成的ssia.jks放到resources目录即可:
keytool -genkeypair -alias ssia -keyalg RSA -keypass ssia123 -keystore ssia.jks -storepass ssia123 -dname "CN=ssia,OU=ssia,O=ssia,L=bj,ST=bj,C=cn" -validity 3650
内容的提问来源于stack exchange,提问作者LosmiNCL

