Spring集成Hibernate项目java.lang.NoClassDefFoundError问题如何解决
问题根因与解决方案
第一个错误(java.lang.NoClassDefFoundError: org/springframework/core/metrics/ApplicationStartup)
- 根本原因:Spring各模块版本不匹配,你的pom中
spring-context版本为5.3.9,而spring-core、spring-beans版本为5.2.16,ApplicationStartup类是Spring 5.3.0版本才新增的类,低版本的spring-core中不存在该类,因此高版本的spring-context调用时会抛出类不存在错误。
第二个错误(统一Spring版本为5.2.16后出现BeanDefinitionStoreException: Failed to read candidate component class)
- 有三个核心诱因:
- 实体类
testTable的getId方法不符合JPA规范:你定义的getId方法携带了多余的参数public Long getId(Long id),JPA要求实体的getter方法必须是无参方法,Spring扫描类元数据时会因反射解析失败报错。 - Spring 5.2.x系列最高仅支持JDK 15,你配置的编译版本为JDK 16,版本不兼容会导致类读取失败。
- 你统一版本时遗漏了
spring-context的版本,仅修改了spring-core、spring-jdbc、spring-orm的版本,spring-context仍为5.3.9,版本冲突未完全解决。
- 实体类
具体修复步骤
- 统一所有Spring依赖版本并适配JDK 16
推荐使用Spring 5.3.x系列(支持JDK 16+),在pom.xml中添加统一版本属性,所有Spring相关依赖都引用该属性:
<properties> <spring.version>5.3.20</spring.version> <maven.compiler.source>16</maven.compiler.source> <maven.compiler.target>16</maven.compiler.target> </properties>
对应修改所有Spring依赖的version标签:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency>
- 升级hibernate-core版本适配Spring 5.3.x
替换原有hibernate-core依赖:
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.4.32.Final</version> </dependency>
- 修复实体类的getter方法错误
修改testTable类的getId方法为无参:
@Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id") public Long getId() { return id; }
- 修正SessionFactory配置的包扫描路径
将sessionFactory方法中setPackagesToScan的参数改为点分隔的标准包名:
sessionFactoryBean.setPackagesToScan("com.my.jdbcTest.Enties");
内容的提问来源于stack exchange,提问作者Omegon
相关产品推荐
相关产品推荐

