Spring组件扫描报错:Unsupported class file major version 64 求助
问题场景
在IntelliJ IDE环境下使用Java 20搭配spring-context 5.3.14版本,通过XML配置<context:component-scan>扫描标注@Component的组件时,抛出如下错误:
BeanDefinitionStoreException: Failed to read candidate component class : nested exception is java.lang.IllegalArgumentException: Unsupported class file major version 64
直接在XML中定义Bean可正常运行,但使用@Component注解触发组件扫描时就会报错,且升级或降级spring-context版本问题依然存在。
相关代码
组件类代码
package com.javaLearn; import org.springframework.stereotype.Component; @Component public class Doctor implements Staff { public void assist() { System.out.println("Doctor is assisting"); } }
XML配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 扫描该包下所有组件 --> <context:component-scan base-package="com.javaLearn"> </context:component-scan> </beans>
完整错误栈
Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [E:\JavaLearn\SpringFrameworkDemo\target\classes\com\javaLearn\Doctor.class]; nested exception is org.springframework.core.NestedIOException: ASM ClassReader failed to parse class file - probably due to a new Java class file version that isn't supported yet: file [E:\JavaLearn\SpringFrameworkDemo\target\classes\com\javaLearn\Doctor.class]; nested exception is java.lang.IllegalArgumentException: Unsupported class file major version 64 at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.scanCandidateComponents(ClassPathScanningCandidateComponentProvider.java:454) at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:316) at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:276) at org.springframework.context.annotation.ComponentScanBeanDefinitionParser.parse(ComponentScanBeanDefinitionParser.java:90) at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:74) at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1391) at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1371) at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:179) at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:149) at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:96) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:514) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:394) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:337) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:305) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:224) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:195) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:257) at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:128) at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:94) at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:133) at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:637) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:522) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:144) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:85) at com.javaLearn.Main.main(Main.java:15) Caused by: org.springframework.core.NestedIOException: ASM ClassReader failed to parse class file - probably due to a new Java class file version that isn't supported yet: file [E:\JavaLearn\SpringFrameworkDemo\target\classes\com\javaLearn\Doctor.class]; nested exception is java.lang.IllegalArgumentException: Unsupported class file major version 64 at org.springframework.core.type.classreading.SimpleMetadataReader.getClassReader(SimpleMetadataReader.java:61) at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:50) at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:103) at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:123) at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.scanCandidateComponents(ClassPathScanningCandidateComponentProvider.java:430) ... 25 more Caused by: java.lang.IllegalArgumentException: Unsupported class file major version 64 at org.springframework.asm.ClassReader.<init>(ClassReader.java:195) at org.springframework.asm.ClassReader.<init>(ClassReader.java:176) at org.springframework.asm.ClassReader.<init>(ClassReader.java:162) at org.springframework.asm.ClassReader.<init>(ClassReader.java:283) at org.springframework.core.type.classreading.SimpleMetadataReader.getClassReader(SimpleMetadataReader.java:58) ... 29 more
原因与解决方法
核心原因
Spring的组件扫描功能依赖ASM库解析类文件的元数据(比如@Component注解),而spring-context 5.3.14内置的ASM版本不支持Java 20的类文件版本(major version 64)。直接在XML定义Bean不需要解析类注解,因此不会触发ASM的类解析操作,所以可以正常运行。
解决方法
升级Spring Framework版本
Spring 5.3.x系列最高仅支持到Java 17,要兼容Java 20需要升级到Spring Framework 6.0及以上版本(6.0版本开始支持Java 17至20)。降低项目编译版本
如果不想升级Spring,可将项目的Java编译版本降到Spring 5.3.x支持的最高版本(Java 17):- 在IntelliJ中打开
File → Project Structure → Project,将Project SDK和Language Level设置为17; - 进入
Build, Execution, Deployment → Compiler → Java Compiler,将Target bytecode version改为17。
- 在IntelliJ中打开
排查依赖冲突
检查项目依赖树,确保没有引入独立的旧版ASM依赖,避免其覆盖Spring自带的ASM版本。可通过构建工具(Maven/Gradle)的依赖分析功能排查冲突。
内容的提问来源于stack exchange,提问作者Shashank Deepak

