如何获取tomcat加载的OpenJPA jar

时间:2013-09-03 13:28:27

标签: maven tomcat7 openjpa websphere-8

我有一个spring mvc app,它使用openjpa 2.1.1作为其持久性框架。它在STS中作为Maven项目开发,并在vFaric TC Server(Tomcat 7)上本地运行。

当我们第一次将战争部署到Websphere 8.5时,我们遇到了与我们的war文件中的以下3个openjpa jar的类加载器冲突:

的geronimo-jpa_2.0_spec-1.1.jar Geronimo的jta_1.1_spec-1.1.1.jar 验证-API-1.0.0.GA.jar

从战争中删除这些并推迟到Websphere的捆绑openjpa工作正常,所以我将openjpa POM依赖范围从'compile'更改为'provided'(这样这些jar就不会被打包到war文件中)。

由于Tomcat 7不符合Java EE,我将3个jar放在Tomcat \ lib中(也尝试了vfabric-tc-server lib - 包装了tomcat),但启动时应用程序看不到JPA类(控制台中的noclassdeffound异常。)

我还尝试将STAR从STS中的“启动配置”添加到服务器类路径中 - 也没有运气。

是否需要在Tomcat中的某处设置类加载器顺序,以便JPA在应用程序之前加载?

我需要的是一个在部署到Tomcat或Websphere时可以工作的构建。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

如果这有助于任何人,NoClassDefFoundError指的是JPA类,但不是我所包含的3个罐子中的一个。我运行了mvn树,发现整个JPA依赖链都是:

的OpenJPA-2.1.1.jar 公地郎2.4.jar 公地集合-3.2.1.jar Geronimo的jta_1.1_spec-1.1.1.jar Geronimo的jpa_2.0_spec-1.1.jar

我还需要添加:

SERP-1.12.0.jar

我最初在tomcat / lib中包含了validation-api-1.0.0.GA.jar,因为它必须从战争中移除以使websphere正常工作,但是将它放在tomcat / lib中会导致&#34 ; javax.validation.ValidationException:无法找到默认提供程序"所以我把它拿出来,这意味着只需要添加上面的6个罐子。

答案 1 :(得分:0)

@ user2743197 - 首先,您需要在Maven pom中定义单独的配置文件。为WAS定义一个配置文件,并通过以下方式使用其OpenJPA依赖关系:

    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>6.0</version>
        <scope>provided</scope>
    </dependency>

这就是我如何使用与WAS v8.x.x捆绑在一起的OpenJPA-2.1.1-SNAPSHOT二进制文件

为Tomcat定义另一个Maven配置文件,它明确地记录了您需要的所有依赖项,除了Tomcat提供的一些与JavaEE相关的规范。因此,将OpenJPA-2.1.1-SNAPSHOT定义为依赖项(当然不是“提供”)。

现在,至于在部署到Tomcat的war项目中引导JPA(不使用Spring),我通常会创建一个这样的类:

@WebListener
public class ApplicationLifeCycleListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
       ...
       // Do some OpenJPA bootstrapping here
       // Get an EntityManager.
       EntityManager em = PersistenceUtil.getEntityManager();
    }
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        //throw new UnsupportedOperationException("Not supported yet.");
        PersistenceUtil.closeEntityManagerFactory();
    }
}

这就是我用来引导Hibernate / JPA的方法。我的PersistenceUtil处理EntityManagerFactory的创建,我的EntityManager的交付等等。

您可能需要考虑使用TomEE。在涉及JPA时,它将为您提供与WebSphere 8.x.x相同的功能。两者都严重依赖Apache产品。 WebSphere 8.x.x和TomEE将允许您使用EJB 3.x,它与CDI一起使用或不使用CDI,更容易使用JPA实现。使用Tomcat,您必须担心自己处理事务管理或者弄清楚如何利用CDI或Spring来管理事务。