我有一个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时可以工作的构建。
非常感谢任何帮助。
答案 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来管理事务。