如何使用 Jax-RS(Jersey) 在 Tomcat7 上运行应用程序 Hibernate 5.x、Jpa 2.1、Java EE7(javaee-api 7.0)
Posted
技术标签:
【中文标题】如何使用 Jax-RS(Jersey) 在 Tomcat7 上运行应用程序 Hibernate 5.x、Jpa 2.1、Java EE7(javaee-api 7.0)【英文标题】:How to run app Hibernate 5.x, Jpa 2.1, Java EE7(javaee-api 7.0) on Tomcat7 with Jax-RS(Jersey) 【发布时间】:2016-11-09 18:59:24 【问题描述】:我有一个简单的应用程序作为 Java 应用程序成功运行。应用程序 Hibernate 5.x、Jpa 2.1、Java EE7(javaee-api 7.0) 中使用的框架。 然后我想添加 Jax-Rs 支持,我想在 Tomcat 7 上运行它。
当我想通过 ServletContextListener 启动应用程序时出现一些错误。似乎没有 persistence.jar WEB_INF/lib 文件夹,但我查看了我创建的文件夹。
java.lang.NoClassDefFoundError: javax/persistence/Persistence
at com.ulger.app.EntityManagerFactorymysql.buildEntiyManagerFactory(EntityManagerFactoryMysql.java:18)
at com.ulger.app.EntityManagerFactoryMysql.<clinit>(EntityManagerFactoryMysql.java:12)
at com.ulger.app.Server.configure(Server.java:10)
at com.ulger.app.Server.start(Server.java:6)
at com.ulger.app.Initializer.contextInitialized(Initializer.java:10)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4994)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5492)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: javax.persistence.Persistence
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
... 14 more
tomcat目录下应用的文件夹
部署描述符
Pom.xml
<!-- Database Connector -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.30</version>
</dependency>
<!-- Database Connector -->
<!-- Javax -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.0.0.GA</version>
<scope>provided</scope>
</dependency>
<!-- Javax -->
<!-- Hibernate -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate.common</groupId>
<artifactId>hibernate-commons-annotations</artifactId>
<version>4.0.1.Final</version>
<classifier>tests</classifier>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.1-api</artifactId>
<version>1.0.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-envers</artifactId>
<version>5.0.1.Final</version>
</dependency>
<!-- Hibernate -->
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<version>3.2.0.Final</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<!-- Logging -->
<!-- JAX-RS (Jersey) -->
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>1.17.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.17.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-servlet</artifactId>
<version>1.17.1</version>
</dependency>
<!-- JAX-RS (Jersey) -->
</dependencies>
【问题讨论】:
不确定但tomcat 7是否支持java EE7 我会尝试使用更高版本的tomcat 仅到 6 版本 顺便说一句,我注意到您的库中存在潜在冲突。你有 JPA 2.0 和 2.1 jar。普通注解也有5.0和4.0 我是手动添加的。我会添加正确的图片。 【参考方案1】:Tomcat 7 不支持 Java EE 7,并且不会从您的 WAR 中加载这些类。如果您重新配置 tomcat 以发出调试日志输出,您应该会看到相应的有关未从您的 WAR 加载/跳过 JAR 文件的警告。
您可以尝试将依赖项降级到 tomcat 7 支持的版本,也可以尝试将 tomcat 升级到版本 8
【讨论】:
我正在尝试在 tomcat 8 和 9 上运行。我遇到生命周期异常。 在 Tomcat 8.5 上工作 :)以上是关于如何使用 Jax-RS(Jersey) 在 Tomcat7 上运行应用程序 Hibernate 5.x、Jpa 2.1、Java EE7(javaee-api 7.0)的主要内容,如果未能解决你的问题,请参考以下文章
Jersey 框架如何在 REST 中实现 JAX-RS API?
如何在 Tomcat 上的 JAX-RS (Jersey) 中返回 HTTP 404 JSON/XML 响应?
如何使用JAX-RS和Jersey在Adobe AEM 6.2中发布json数据
如何使用 Jax-RS(Jersey) 在 Tomcat7 上运行应用程序 Hibernate 5.x、Jpa 2.1、Java EE7(javaee-api 7.0)