我正在尝试在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/

10-11 22:46