Spring启动报错IllegalStateException:无法加载配置类JavaConfig
问题原因
你的配置类、启动类代码写法没有错误,报错核心原因是使用的Spring版本与当前运行环境的JDK版本不兼容。
异常栈中明确抛出InaccessibleObjectException,提示module java.base does not "opens java.lang" to unnamed module,这是JDK9及以上版本引入模块访问限制导致的:你当前使用的是Spring 4.x这类老版本,Spring在处理@Configuration标注的配置类时,会通过内置CGLIB生成动态代理,过程中需要反射调用JDK核心类的受保护方法,高版本JDK默认禁止这种跨模块的反射访问,直接触发异常。
解决方案
按优先级从高到低可选以下方案:
- 优先选择版本对齐:将运行环境JDK切换为JDK8,Spring 4.x/5.0.x系列与JDK8兼容性最佳,无需额外配置即可正常运行,适合新手快速排错。
- 升级Spring版本:将Spring依赖升级到5.3.x及以上正式版本,高版本Spring已经完成高版本JDK的适配,不会触发CGLIB反射访问的模块限制;如果使用SpringBoot,可选择2.7.x版本适配JDK11,3.x版本适配JDK17。
- 临时绕过限制:如果暂时无法调整JDK或Spring版本,可在JVM启动参数中添加如下配置,放开对应模块的访问权限:
--add-opens java.base/java.lang=ALL-UNNAMED
该方案仅用于临时调试,不建议在生产环境使用,长期运行还是建议做官方推荐的版本适配。
相关代码与异常信息
配置类代码
package SpringAnnotPckg; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration @ComponentScan("SpringAnnotPckg") public class JavaConfig { public JavaConfig() { } }
主启动类代码
package SpringAnnotPckg; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class TestJavaconfig { public static void main(String[] args) { // TODO Auto-generated method stub AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(JavaConfig.class); Car car=context.getBean("audiCar",Car.class); car.print(); context.close(); } }
异常信息
Jul 06, 2022 1:19:01 PM org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh INFO: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@3fd7a715: startup date [Wed Jul 06 13:19:01 IST 2022]; root of context hierarchy Exception in thread "main" java.lang.IllegalStateException: Cannot load configuration class: SpringAnnotPckg.JavaConfig at org.springframework.context.annotation.ConfigurationClassPostProcessor.enhanceConfigurationClasses(ConfigurationClassPostProcessor.java:403) at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanFactory(ConfigurationClassPostProcessor.java:249) at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:281) at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:125) at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:687) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:525) at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:84) at SpringAnnotPckg.TestJavaconfig.main(TestJavaconfig.java:9) Caused by: java.lang.ExceptionInInitializerError at org.springframework.context.annotation.ConfigurationClassEnhancer.newEnhancer(ConfigurationClassEnhancer.java:122) at org.springframework.context.annotation.ConfigurationClassEnhancer.enhance(ConfigurationClassEnhancer.java:110) at org.springframework.context.annotation.ConfigurationClassPostProcessor.enhanceConfigurationClasses(ConfigurationClassPostProcessor.java:393) ... 7 more Caused by: org.springframework.cglib.core.CodeGenerationException: 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 @641147d0 at org.springframework.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:464) at org.springframework.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:336) at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:93) at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:91) at org.springframework.cglib.core.internal.LoadingCache$2.call(LoadingCache.java:54) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at org.springframework.cglib.core.internal.LoadingCache.createEntry(LoadingCache.java:61) at org.springframework.cglib.core.internal.LoadingCache.get(LoadingCache.java:34) at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:116) at org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:291) at org.springframework.cglib.core.KeyFactory$Generator.create(KeyFactory.java:221) at org.springframework.cglib.core.KeyFactory.create(KeyFactory.java:174) at org.springframework.cglib.core.KeyFactory.create(KeyFactory.java:153) at org.springframework.cglib.proxy.Enhancer.<clinit>(Enhancer.java:73) ... 10 more 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 @641147d0 at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354) at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297) at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:199) at java.base/java.lang.reflect.Method.setAccessible(Method.java:193) at org.springframework.cglib.core.ReflectUtils$1.run(ReflectUtils.java:61) at java.base/java.security.AccessController.doPrivileged(AccessController.java:569) at org.springframework.cglib.core.ReflectUtils.<clinit>(ReflectUtils.java:52) at org.springframework.cglib.core.KeyFactory$Generator.generateClass(KeyFactory.java:243) at org.springframework.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25) at org.springframework.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:329) ... 22 more
内容的提问来源于stack exchange,提问作者Hema Sireesha
相关产品推荐
相关产品推荐

