TomEE7.1.4(Tomcat8.5)启动报GRAVE:子容器启动失败 JPA相关NoSuchMethodError
问题根因定位
报错栈的核心错误为java.lang.NoSuchMethodError: javax.persistence.PersistenceContext.synchronization()Ljavax/persistence/SynchronizationType;,该问题和Catalina本身无关,本质是JPA规范包版本冲突:
- JPA 2.1及更早版本的
@PersistenceContext注解不存在synchronization()方法,该方法是JPA 2.2版本才新增的特性 - 你使用的TomEE 7.1.4属于Java EE 7规范实现,内置的JPA版本为2.1,而你的项目中额外引入了JPA 2.2或更高版本的JPA规范包,导致运行时类加载时出现方法找不到的错误
解决方案步骤
- 排查项目依赖
检查Maven的pom.xml或Gradle的build.gradle配置,删除所有自行引入的javax.persistence-api、hibernate-jpa-2.x-api等JPA规范包依赖,TomEE容器本身已经内置了对应版本的JPA规范与实现,项目不需要额外引入。 - 调整依赖作用域(如需保留JPA依赖用于编译)
如果代码编译必须声明JPA依赖,需要将依赖的作用域设置为provided,避免打包时将JPA规范包打入WAR包,运行时默认使用容器提供的版本,Maven配置示例如下:<dependency> <groupId>javax.persistence</groupId> <artifactId>javax.persistence-api</artifactId> <version>2.1</version> <scope>provided</scope> </dependency> - 清理后重新部署
清理Eclipse项目编译缓存,删除TomEE工作目录下的旧部署文件,重启服务即可。
额外排查点
如果执行上述步骤后问题仍然存在,可进一步检查:
- 项目
WEB-INF/lib目录下是否存在手动放入的JPA相关jar包,如有直接删除 - Eclipse项目构建路径中是否引入了多余的高版本JPA规范包,移除后重新构建项目
内容的提问来源于stack exchange,提问作者Antonio Sanchirico
相关产品推荐
相关产品推荐

