You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java11升级后EclipseLink3.0报IncompatibleClassChangeError求助

项目基于Java及JPA的EclipseLink实现,原本Java 8搭配EclipseLink 2.5.2运行正常。升级至Java 11时,按EclipseLink官方指引将版本升级到3.0后,出现以下错误:

[ERROR ][main] 
Context initialization failed org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'defaultEntityManagerFactory' defined in ServletContext resource 
[/META-INF/applicationContext.xml]: 
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:591)
: Exception encountered during context initialization - cancelling refresh attempt: 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'defaultEntityManagerFactory' 
defined in ServletContext resource [/META-INF/applicationContext.xml]: Invocation of init method failed;
nested exception is java.lang.IncompatibleClassChangeError: Class org.eclipse.persistence.jpa.PersistenceProvider does not implement the requested interface javax.persistence.spi.PersistenceProvider 

完整错误栈:

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1786)|   at
 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:602)|      at
 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524)|        at
 org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)|      at
 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)|  at
 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)|       at 
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)| at 
org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1154)|        at 
org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:908)| at 
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583)| at 
org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:401)|      at 
org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:292)|     at 
org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:103)|    at
 org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4494)|   at 
org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4946)|   at 
org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)|        at 
org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1328)|     at
 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1318)|     at 
java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)|  at 
org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)| at 
java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140)|     at 
org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:866)|        at
 org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:795)|  at 
org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)|        at 
org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1328)|     at 
org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1318)|     at 
java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)|  at 
org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)| at 
java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140)|     at 
org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:866)|        at 
org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:249)|      at 
org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)|        at 
org.apache.catalina.core.StandardService.startInternal(StandardService.java:428)|    at 
org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)|        at 
org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:923)|      at
 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)|        at 
org.apache.catalina.startup.Tomcat.start(Tomcat.java:486)|   at 

解决方案

原因分析

EclipseLink 3.0基于JPA 3.0规范,该规范将JPA API的包名从javax.persistence迁移到了jakarta.persistence。项目中使用的Spring版本可能仍依赖旧的javax.persistence接口,导致类加载时出现不兼容错误。

解决步骤

  • 升级Spring版本:确保使用的Spring版本支持JPA 3.0(如Spring 5.3.x及以上,或Spring Boot 2.6.x及以上),旧版本Spring不兼容Jakarta EE规范的API包名变更。
  • 清理JPA依赖:移除项目中所有javax.persistence-api等旧依赖,EclipseLink 3.0已内置JPA 3.0的jakarta.persistence API,无需额外引入。
  • 更新配置文件:
    • 在applicationContext.xml中,确认EntityManagerFactory的PersistenceProvider指向EclipseLink 3.0的实现类org.eclipse.persistence.jpa.PersistenceProvider(该类现在实现的是jakarta.persistence.spi.PersistenceProvider)。
    • 若有JPA实体的XML映射文件,将命名空间从http://java.sun.com/xml/ns/persistence替换为https://jakarta.ee/xml/ns/persistence。
  • 排查依赖冲突:使用Maven的mvn dependency:tree或Gradle的./gradlew dependencies命令,检查是否有依赖传递引入的javax.persistence旧包,通过<exclusions>标签排除这些冲突依赖。
  • 验证类路径:确保运行时类路径中仅存在jakarta.persistence相关的类,无javax.persistence的遗留文件。

内容的提问来源于stack exchange,提问作者NikhilP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 21:40:42