我在我的代码中使用hibernate,并在jboss 4.0.5GA上运行我的应用程序。提供的jboss hibernate库不包含我需要的实体管理器。即使我在我的应用程序的lib目录中包含了hibernate 3.6.0,但在启动时却找不到它。
java.lang.NoClassDefFoundError: org/hibernate/cfg/ExtendedMappings at org.hibernate.ejb.Ejb3Configuration.(Ejb3Configuration.java:129) at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:55) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47) ........ Caused by: java.lang.ClassNotFoundException: Unexpected error during load of: org.hibernate.cfg.ExtendedMappings, msg=Implementing class at org.jboss.mx.loading.RepositoryClassLoader.loadClassImpl(RepositoryClassLoader.java:550) at org.jboss.mx.loading.RepositoryClassLoader.loadClass(RepositoryClassLoader.java:405) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) ... 142 more Caused by: java.lang.IncompatibleClassChangeError: Implementing class
我认为这是因为jboss的hibernate核心库是在随应用程序提供的hibernate 3.6 libs之前加载的。
问题是我无法更改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提供了一个hibernate核心(版本3.2)而不是实体管理器或注释,我尝试提供实体管理器和放大器。我的应用程序中相同版本的hibernate(3.2.0GA)的注释库。然而,这导致了
java.lang.IllegalAccessError: tried to access method org.hibernate.cfg.Mappings,因为(我认为)jar文件是由不同的类加载器/来自不同的存储库加载的。根据{{3}},所有hibernate库都需要从同一个地方加载。在我的情况下不可能。
我还尝试使用ear-deployer.xml来打开隔离的类加载。这打开了整个潘多拉的一系列例外情况,我认为我无法修复。
帮助!