0

我在我的代码中使用休眠,并在 jboss 4.0.5GA 上运行我的应用程序。提供的 jboss hibernate 库不包括我需要的实体管理器。即使我在我的应用程序的 lib 目录中包含了 hibernate 3.6.0,但在启动时找不到它。

java.lang.NoClassDefFoundError: org/hibernate/cfg/ExtendedMappings
        在 org.hibernate.ejb.Ejb3Configuration.(Ejb3Configuration.java:129)
        在 org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:55)
        在 javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63)
        在 javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47)

...........
原因:java.lang.ClassNotFoundException:加载时出现意外错误:org.hibernate.cfg.ExtendedMappings,msg=Implementing class
        在 org.jboss.mx.loading.RepositoryClassLoader.loadClassImpl(RepositoryClassLoader.java:550)
        在 org.jboss.mx.loading.RepositoryClassLoader.loadClass(RepositoryClassLoader.java:405)
        在 java.lang.ClassLoader.loadClass(ClassLoader.java:247)
        ... 142 更多
引起:java.lang.IncompatibleClassChangeError:实现类

我认为这是因为 jboss 的 hibernate 核心库是在应用程序提供的 hibernate 3.6 库之前加载的。

问题是我无法更改 JBOSS_HOME 下的任何 jar 文件。我可以更改/提供各种 jboss 配置,因为我们将域目录设置为应用程序主目录,因此例如我们提供 jboss/conf/jboss-service.xml 并且我可以对其进行调整。

我尝试了几种方法来解决这个问题,这就是我发现的:
如果我从 JBOSS_HOME/server/default/lib 中删除 hibernate3.jar,问题就解决了如果我替换 JBOSS_HOME/server/default/lib/hibernate3 .jar 具有正确的版本(3.6.0),也可以修复它

我尝试了另一种方法:鉴于 jboss 提供了休眠核心(3.2 版)但不提供实体管理器或注释,我尝试在我的应用程序中为同一版本的休眠(3.2.0GA)提供实体管理器和注释库。然而这引起了

java.lang.IllegalAccessError:试图访问方法 org.hibernate.cfg.Mappings
因为(我认为)jar 文件是由不同的类加载器/来自不同的存储库加载的。根据这篇文章,所有休眠库都需要从同一个地方加载。在我的情况下不可能。

我还尝试使用 ear-deployer.xml 来打开隔离类加载。这打开了整个潘多拉的盒子,我认为我无法修复。

帮助!

4

0 回答 0