Spring注解式注入失败:Java 19类文件版本不支持问题求助
Spring注解注入数据库时遇Unsupported class file major version 63错误
我是Spring新手,想用注解实现数据库选择注入,已经在applicationContext.xml里配置了组件扫描,指定扫描com.springDemo包下带@Component("database")注解的类作为数据库实现。当前环境是Java 19、Spring 5.3.9,重装JDK和Spring后问题依然存在,报错如下:
Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: [eclipse-workspace\JavaSpring\springIocAnnotation\bin\com\springDemo\ICustomerDal.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 [eclipse-workspace\JavaSpring\springIocAnnotation\bin\com\springDemo\ICustomerDal.class]; nested exception is java.lang.IllegalArgumentException: Unsupported class file major version 63
相关代码文件
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 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.springDemo"></context:component-scan> </beans>
ICustomerDal.java
package com.springDemo; public interface ICustomerDal { void add(); }
Main.java
package com.springDemo; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); ICustomerDal customerDal = context.getBean("database",ICustomerDal.class); customerDal.add(); } }
mySqlCustomerDal.java
package com.springDemo; import org.springframework.stereotype.Component; @Component("database") public class mySqlCustomerDal implements ICustomerDal{ String connectionString; public String getConnectionString() { return connectionString; } public void setConnectionString(String connectionString) { this.connectionString = connectionString; } @Override public void add() { System.out.println("Connection String : " +this.connectionString); System.out.println("MySQL database added"); } }
问题原因
这个错误的核心是Spring版本与Java版本不兼容:
- Java 19的class文件版本号是63
- Spring 5.3.x系列官方最高只支持到Java 17(class版本61),其内置的ASM库无法识别Java 19的class文件格式
解决办法
办法一:降级Java版本(推荐)
将JDK版本降到Java 17或更低(比如Java 8/11),Spring 5.3.9对这些版本有完善的支持,无需修改其他配置。
办法二:升级Spring版本
如果必须使用Java 19,需要将Spring版本升级到6.x系列(比如Spring 6.0+),Spring 6开始原生支持Java 17及以上版本,包括Java 19。注意升级Spring后,需要同步调整相关依赖的版本,确保兼容性。
额外建议
代码里的mySqlCustomerDal类名不符合Java命名规范,建议改为MySqlCustomerDal(首字母大写),这是Java开发的通用约定,能提升代码可读性。
内容的提问来源于stack exchange,提问作者erday
相关产品推荐
相关产品推荐

