SpringBoot 2.5.9与EclipseLink 3.0.0升级后出现类找不到异常
解决SpringBoot 2.5.9 + EclipseLink 3.0.0的类找不到问题
错误原因
你遇到的ClassNotFoundException: jakarta.persistence.spi.PersistenceProvider本质是依赖版本不兼容:
- EclipseLink 3.0.0是Jakarta EE 9适配版本,所有JPA API包名从
javax.persistence迁移到了jakarta.persistence - SpringBoot 2.5.x系列仍基于传统Java EE,依赖的是
javax.persistence相关类,两者包名不匹配导致类加载失败
可行解决方案
方案1:降级EclipseLink到兼容版本
将EclipseLink版本回退到2.7.x(比如你之前用的2.7.12),这个版本完全适配SpringBoot 2.5.x的javax.persistence依赖,无需额外调整其他配置。
方案2:升级SpringBoot到支持Jakarta EE的版本
SpringBoot 3.0及以上版本全面支持Jakarta EE,你可以:
- 把SpringBoot版本升级到3.0.x或更高(比如3.0.0)
- 保留EclipseLink 3.0.0版本
- 注意:SpringBoot 3.x要求JDK版本至少为17,同时需要检查项目中其他第三方依赖是否也适配Jakarta EE(比如替换
javax.*依赖为jakarta.*)
错误日志原文
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.orm.jpa.JpaVendorAdapter]: Factory method 'jpaVendorAdapter' threw exception; nested exception is java.lang.NoClassDefFoundError: jakarta/persistence/spi/PersistenceProvider at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) ... 62 common frames omitted Caused by: java.lang.NoClassDefFoundError: jakarta/persistence/spi/PersistenceProvider at java.base/java.lang.ClassLoader.defineClass1(Native Method) at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017) at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174) at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2472) at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:875) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1376) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1220) at org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter.<init>(EclipseLinkJpaVendorAdapter.java:52) at com.config.EclipseLinkJpaConfiguration.createJpaVendorAdapter(EclipseLinkJpaConfiguration.java:38) at org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration.jpaVendorAdapter(JpaBaseConfiguration.java:105) at com.config.EclipseLinkJpaConfiguration$$EnhancerBySpringCGLIB$$5f9eca68.CGLIB$jpaVendorAdapter$8(<generated>) at com.config.EclipseLinkJpaConfiguration$$EnhancerBySpringCGLIB$$5f9eca68$$FastClassBySpringCGLIB$$54dd22bf.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244) at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331) at com.config.EclipseLinkJpaConfiguration$$EnhancerBySpringCGLIB$$5f9eca68.jpaVendorAdapter(<generated>) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ... 63 common frames omitted Caused by: java.lang.ClassNotFoundException: jakarta.persistence.spi.PersistenceProvider at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1412) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1220) ... 83 common frames omitted
内容的提问来源于stack exchange,提问作者Nunyet Calçada
相关产品推荐
相关产品推荐

