我在我的代码中使用休眠,并在 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 来打开隔离类加载。这打开了整个潘多拉的盒子,我认为我无法修复。
帮助!