我试图让一个WAR文件在Karaf OSGi容器内运行。应用程序在独立的Jetty 6.1.26中正确运行,但是当应用程序在Karaf中运行时,我得到以下异常并且Karaf实例冻结:
WARN org.hibernate.ejb.packaging.InputStreamZippedJarVisitor - Unable to find
file (ignored): bundle://125.0:240/ java.lang.NullPointerException: in is null
请注意,应用程序不依赖于单独的OSGi包中的Hibernate;它包括WEB-INF / lib中的hibernate jar。
我已经检查过这篇文章的信息:Equinox (OSGi) and JPA/Hibernate - Finding Entities。但是,应用程序使用的是JPA,而不是直接使用Hibernate。应用程序的配置很像这篇文章中的第二个选项:Difference between configuring data source in persistence.xml and in spring configuration files。因此,我没有Hibernate SessionFactory的句柄,它允许我设置annotatedClasses属性。
关于如何通过例外的任何想法?
答案 0 :(得分:4)
我与作者并行工作,我将在此处发布我们的解决方案,以供将来遇到此问题的任何人使用。
抛出异常是因为Hibernate试图解压缩它的jar来寻找持久性类。正如其他帖子所提到的,OSGi不允许Hibernate像一个类加载器一样,所以这就失败了。解决方案是指定手动加载所需的所有类,然后告诉它不要尝试加载任何其他类。
我们使用了persistence.xml
文件和orm.xml
文件(我们使用默认名称,因此我们无需在applicationContext.xml
中指定。)
我们的persistence.xml
文件只是使用orm.xml
标记指向<mapping-file>
。它还包含<exclude-unlisted-classes/>
标记,以防止hibernate尝试加载其他类。
我们的orm.xml
文件使用<entity class="path.to.my.class" metadata-complete="false"/>
来调出我们需要加载的每个实体类。 metadata-complete
部分告诉hibernate使用类中的注释来完成配置。