Maven 如何让tomcat加载OpenJPA JAR

Maven 如何让tomcat加载OpenJPA JAR,maven,tomcat7,openjpa,websphere-8,Maven,Tomcat7,Openjpa,Websphere 8,我有一个SpringMVC应用程序,它使用OpenJPA2.1.1作为持久化框架。它是作为STS中的Maven项目开发的,在vFaric TC服务器(Tomcat 7)上本地运行 当我们首次将war部署到Websphere 8.5时,我们遇到了类加载器与war文件中的以下3个openjpa JAR冲突: geronimo-jpa_2.0_spec-1.1.jar geronimo-jta_1.1_spec-1.1.1.jar validation-api-1.0.0.GA.jar 将这些从war

我有一个SpringMVC应用程序,它使用OpenJPA2.1.1作为持久化框架。它是作为STS中的Maven项目开发的,在vFaric TC服务器(Tomcat 7)上本地运行

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

geronimo-jpa_2.0_spec-1.1.jar geronimo-jta_1.1_spec-1.1.1.jar validation-api-1.0.0.GA.jar

将这些从war中删除并遵从Websphere捆绑的openjpa效果很好,因此我将openjpa POM依赖范围从“compile”更改为“provided”(这样这些JAR就不会打包到war文件中)

由于Tomcat 7不兼容Java EE,我将3个JAR放在了Tomcat\lib中(也尝试了vfabric tc server lib,它包装了Tomcat),但是应用程序在启动时看不到JPA类(控制台中发现了NoClassDef异常)

我还尝试将JAR从STS中的“启动配置”添加到服务器类路径中,但也没有成功

是否需要在Tomcat中的某个地方设置类装入器顺序,以便JPA在应用程序之前装入

我需要的是一个在部署到Tomcat或Websphere时能够工作的构建


任何帮助都将不胜感激。

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

openjpa-2.1.1.jar commons-lang-2.4.jar commons-collections-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


我最初将validation-api-1.0.0.GA.jar也包括在tomcat/lib中,因为它必须从war中删除才能让websphere工作,但将它放在tomcat/lib中会导致“javax.validation.ValidationException:找不到默认提供程序”,所以我将其去掉,这意味着只需要添加上面的6个jar

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

    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>6.0</version>
        <scope>provided</scope>
    </dependency>
这就是我对引导Hibernate/JPA所做的。我的PersistenceUtil处理EntityManager工厂的创建、EntityManager的交付等


也许你应该考虑一下托美。在JPA方面,它将为您提供与WebSphere8.x.x相同的功能。两者都严重依赖Apache产品。WebSphere8.x.x和TomEE将允许您使用EJB3.x,无论是否使用CDI,它都更易于与JPA实现一起使用。使用Tomcat时,您必须自己处理事务管理,或者考虑如何利用CDI或Spring来管理事务。

对于任何感兴趣的人,这是我的Tomcat+AutomanagedEM+OpenJPA包装器。参见示例_webapp/web-inf/lib/JAR所在的文件夹。它可能是使用Tomcat+JPA技术的任何人的一个很好的参考。
@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();
    }
}