如何使用 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?

JAX-RS Jersey 读取内容类型为“*”的实体

如何使用 Jax-RS(Jersey) 在 Tomcat7 上运行应用程序 Hibernate 5.x、Jpa 2.1、Java EE7(javaee-api 7.0)