我正在尝试在Tomcat 8上运行JPA servlet。
从我的servlet中,调用位于另一个Eclipse项目(JPA项目,而非WEB项目)中的名为QueryDB.class的类的方法。
但是tomcat抛出
SEVERE: Servlet.service() for servlet [MyRESTService] in context with path [/AutomationWeb] threw exception [org.glassfish.jersey.server.ContainerException: java.lang.NoClassDefFoundError: javax/persistence/Persistence] with root cause
java.lang.ClassNotFoundException: javax.persistence.Persistence
at java.net.URLClassLoader$1.run(Unknown Source)
...
在EntityManagerFactory emf = Persistence.createEntityManagerFactory(“ AutomationDB_JPA”)行处引发异常。在QueryDB.class中
我在Maven中使用Eclipse Mars。我在pom.xml中定义了EclipseLink:
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>2.6.1</version>
</dependency>
我的应用程序的WEB-INF / lib中有以下jar:
eclipselink-2.6.1.jar
javax.persistence-2.1.0.jar,它内部具有javax / persistence / Persistence.class
tomcat日志中没有其他SEVERE消息。
此设置有什么问题?
我还尝试将持久性jar添加到apache-tomcat-8.0.28 \ lib,但是遇到了相同的错误。
更新:我将Persistence.createEntityManagerFactory调用移到servlet本身,并且没有类加载器异常。那么问题就改变了:为什么用于QueryDB.class的类加载器不同于servlet的类加载器?另外,为什么在QueryDB.class中使用的类加载器看不到servlet的类加载器看到的Persistence.class?
最佳答案
好的,我找到了解决方案。
从tomcat VM类路径中排除了我的JPA项目
将我的JPA项目转换为Utility项目
在我的Web项目属性中修改了Deployment Assembly,以便它
将接受JPA项目作为.jar存档到WEB-INF / lib
我没有classloader异常了。
关于eclipse - javax.persistence jar未加载到tomcat中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33835884/