问题描述

 2025-07-30 14:35:08.493  WARN 23300 --- [           main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ServiceBean:cn.bugstack.gateway.rpc.IActivityBooth:1.0.0': Instantiation of bean failed; nested exception is java.lang.ExceptionInInitializerError
 2025-07-30 14:35:08.493  INFO 23300 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'
 2025-07-30 14:35:08.495  INFO 23300 --- [           main] f.a.ReferenceAnnotationBeanPostProcessor : class org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor was destroying!
 2025-07-30 14:35:08.495  INFO 23300 --- [           main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
 2025-07-30 14:35:08.501  INFO 23300 --- [           main] ConditionEvaluationReportLoggingListener : 
 ​
 Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
 2025-07-30 14:35:08.504 ERROR 23300 --- [           main] o.s.boot.SpringApplication               : Application run failed
 ​
 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ServiceBean:cn.bugstack.gateway.rpc.IActivityBooth:1.0.0': Instantiation of bean failed; nested exception is java.lang.ExceptionInInitializerError
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1318) ~[spring-beans-5.2.10.RELEASE.jar:5.2.10.RELEASE]
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1213) ~[spring-beans-5.2.10.RELEASE.jar:5.2.10.RELEASE]
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:556) ~[spring-beans-5.2.10.RELEASE.jar:5.2.10.RELEASE]
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:516) ~[spring-beans-5.2.10.RELEASE.jar:5.2.10.RELEASE]
     at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:324) ~[spring-beans-5.2.10.RELEASE.jar:5.2.10.RELEASE]
     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.2.10.RELEASE.jar:5.2.10.RELEASE]
     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322) ~[spring-beans-5.2.10.RELEASE.jar:5.2.10.RELEASE]
     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.10.RELEASE.jar:5.2.10.RELEASE]
     at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:897) ~[spring-beans-5.2.10.RELEASE.jar:5.2.10.RELEASE]
     at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:879) ~[spring-context-5.2.10.RELEASE.jar:5.2.10.RELEASE]
     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:551) ~[spring-context-5.2.10.RELEASE.jar:5.2.10.RELEASE]
     at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143) ~[spring-boot-2.3.5.RELEASE.jar:2.3.5.RELEASE]
     at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758) ~[spring-boot-2.3.5.RELEASE.jar:2.3.5.RELEASE]
     at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750) ~[spring-boot-2.3.5.RELEASE.jar:2.3.5.RELEASE]
     at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:405) ~[spring-boot-2.3.5.RELEASE.jar:2.3.5.RELEASE]
     at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-2.3.5.RELEASE.jar:2.3.5.RELEASE]
     at org.springframework.boot.SpringApplication.run(SpringApplication.java:1237) ~[spring-boot-2.3.5.RELEASE.jar:2.3.5.RELEASE]
     at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) ~[spring-boot-2.3.5.RELEASE.jar:2.3.5.RELEASE]
     at cn.bugstack.gateway.ApiGatewayTestApplication.main(ApiGatewayTestApplication.java:14) ~[classes/:na]
 Caused by: java.lang.ExceptionInInitializerError: null
     at java.base/jdk.internal.misc.Unsafe.ensureClassInitialized0(Native Method) ~[na:na]
     at java.base/jdk.internal.misc.Unsafe.ensureClassInitialized(Unsafe.java:1160) ~[na:na]
     at java.base/jdk.internal.reflect.MethodHandleAccessorFactory.ensureClassInitialized(MethodHandleAccessorFactory.java:300) ~[na:na]
     at java.base/jdk.internal.reflect.MethodHandleAccessorFactory.newConstructorAccessor(MethodHandleAccessorFactory.java:103) ~[na:na]
     at java.base/jdk.internal.reflect.ReflectionFactory.newConstructorAccessor(ReflectionFactory.java:200) ~[na:na]
     at java.base/java.lang.reflect.Constructor.acquireConstructorAccessor(Constructor.java:549) ~[na:na]
     at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) ~[na:na]
     at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:486) ~[na:na]
     at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:204) ~[spring-beans-5.2.10.RELEASE.jar:5.2.10.RELEASE]
     at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:87) ~[spring-beans-5.2.10.RELEASE.jar:5.2.10.RELEASE]
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1310) ~[spring-beans-5.2.10.RELEASE.jar:5.2.10.RELEASE]
     ... 18 common frames omitted
 Caused by: java.lang.IllegalStateException: Failed to create adaptive instance: java.lang.IllegalStateException: Can't create adaptive extension interface org.apache.dubbo.rpc.Protocol, cause: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @5e0826e7
     at org.apache.dubbo.common.extension.ExtensionLoader.getAdaptiveExtension(ExtensionLoader.java:553) ~[dubbo-2.7.5.jar:2.7.5]
     at org.apache.dubbo.config.ServiceConfig.<clinit>(ServiceConfig.java:117) ~[dubbo-2.7.5.jar:2.7.5]
     ... 29 common frames omitted
 Caused by: java.lang.IllegalStateException: Can't create adaptive extension interface org.apache.dubbo.rpc.Protocol, cause: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @5e0826e7
     at org.apache.dubbo.common.extension.ExtensionLoader.createAdaptiveExtension(ExtensionLoader.java:954) ~[dubbo-2.7.5.jar:2.7.5]
     at org.apache.dubbo.common.extension.ExtensionLoader.getAdaptiveExtension(ExtensionLoader.java:549) ~[dubbo-2.7.5.jar:2.7.5]
     ... 30 common frames omitted
 Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @5e0826e7
     at java.base/java.lang.reflect.AccessibleObject.throwInaccessibleObjectException(AccessibleObject.java:391) ~[na:na]
     at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:367) ~[na:na]
     at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:315) ~[na:na]
     at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:203) ~[na:na]
     at java.base/java.lang.reflect.Method.setAccessible(Method.java:197) ~[na:na]
     at javassist.ClassPool.toClass2(ClassPool.java:1181) ~[javassist-3.20.0-GA.jar:na]
     at javassist.ClassPool.toClass(ClassPool.java:1164) ~[javassist-3.20.0-GA.jar:na]
     at javassist.CtClass.toClass(CtClass.java:1305) ~[javassist-3.20.0-GA.jar:na]
     at org.apache.dubbo.common.compiler.support.JavassistCompiler.doCompile(JavassistCompiler.java:82) ~[dubbo-2.7.5.jar:2.7.5]
     at org.apache.dubbo.common.compiler.support.AbstractCompiler.compile(AbstractCompiler.java:58) ~[dubbo-2.7.5.jar:2.7.5]
     at org.apache.dubbo.common.compiler.support.AdaptiveCompiler.compile(AdaptiveCompiler.java:45) ~[dubbo-2.7.5.jar:2.7.5]
     at org.apache.dubbo.common.extension.ExtensionLoader.createAdaptiveExtensionClass(ExtensionLoader.java:970) ~[dubbo-2.7.5.jar:2.7.5]
     at org.apache.dubbo.common.extension.ExtensionLoader.getAdaptiveExtensionClass(ExtensionLoader.java:963) ~[dubbo-2.7.5.jar:2.7.5]
     at org.apache.dubbo.common.extension.ExtensionLoader.createAdaptiveExtension(ExtensionLoader.java:952) ~[dubbo-2.7.5.jar:2.7.5]
     ... 31 common frames omitted
 ​

这里有一个最关键的报错点

 Caused by: java.lang.IllegalStateException: Failed to create adaptive instance: java.lang.IllegalStateException: Can't create adaptive extension interface org.apache.dubbo.rpc.Protocol, cause: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @5e0826e7
 at org.apache.dubbo.common.extension.ExtensionLoader.getAdaptiveExtension(ExtensionLoader.java:553) ~[dubbo-2.7.5.jar:2.7.5]
 at org.apache.dubbo.config.ServiceConfig.<clinit>(ServiceConfig.java:117) ~[dubbo-2.7.5.jar:2.7.5]
 ... 29 common frames omitted

这里我的项目是要使用 Dubbo 进行一个远程连接,而 Dubbo 2.7.5 使用 Javassist 编译生成动态代理类,在 Java 中试图使用 ClassLoader#defineClass(...) 动态生成类时被禁止访问,因为 模块 java.base 不对 unnamed module 开放 java.lang 包。

这个问题产生的背景是从 Java 9 起,引入了模块系统(Jigsaw),默认对反射访问做了更严格的限制:

  • ClassLoader#defineClassprotected final 方法;

  • 不能通过 setAccessible(true) 打开 java.lang.ClassLoader 的方法;

  • 而 Dubbo 动态扩展机制(ExtensionLoader)底层需要使用 defineClass

  • 因为 Javassist 编译后,要把 class 加载进 JVM。

而我这里的 Java 版本是 21 因此这里的解决方案搜集到的有三个

解决方案

方案一【推荐】:添加 JVM 启动参数,开放访问

IDEA 或启动脚本中添加如下 JVM 参数(用于打开 java.lang 给 Dubbo 使用):

 --add-opens java.base/java.lang=ALL-UNNAMED

例如:

 java --add-opens java.base/java.lang=ALL-UNNAMED -jar your-app.jar

如果你在 IDEA 中运行,可以这样添加:

  • Edit ConfigurationsVM options--add-opens java.base/java.lang=ALL-UNNAMED

这个参数就是解决这个问题的核心方法。

方案二:降低 JDK 版本至 Java 8

由于是 Java 9 之后引入的模块,所以将版本降至 Java 8 即可解决,但是要注意降低 JDK 版本是否会对你的项目造成其它影响。

方案三:升级 Dubbo 版本

一般来说可以升级到

  • Dubbo 2.7.8+

  • Dubbo 3.1.x(已全面支持 JDK 17)

注意同时升级相关的 Spring Boot 适配包,如 dubbo-spring-boot-starter

这个注意查看 Dubbo 的版本支持。