2011-08-23 93 views
1

我正在尝试将Hibernate Envers集成到一个已开发的应用程序中。Hibernate ENVERS类加载问题

我在EAR包内部发布了Hibernate Envers JAR,它引发了一个关于类加载器和某种冲突的丑陋例外。

如果我避免航运耳内的Envers JAR,我把它在JBoss中的“lib”目录,然后一切工作正常,但我需要船库与应用程序一起,因为我没有访问这个全局“lib”目录。

我在JBoss 5.1.0.GA上部署,使用Hibernate 3.3.GA和Envers 1.2.2.GA.

任何线索?

例外的是这一个:

15:31:21,621 WARN [arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator_2] TwoPhaseCoordinator.beforeC 
ompletion - failed for com.ar[email protected]84697f 
java.lang.LinkageError: loader constraint violation: when resolving interface method "org.hibernate.Transaction.register 
Synchronization(Ljavax/transaction/Synchronization;)V" the class loader (instance of org/jboss/classloader/spi/base/Base 
ClassLoader) of the current class, org/hibernate/envers/synchronization/AuditSyncManager, and the class loader (instance 
of org/jboss/classloader/spi/base/BaseClassLoader) for resolved class, org/hibernate/Transaction, have different Class 
objects for the type javax/transaction/Synchronization used in the signature 
     at org.hibernate.envers.synchronization.AuditSyncManager.get(AuditSyncManager.java:56) 
     at org.hibernate.envers.event.AuditEventListener.onPostUpdate(AuditEventListener.java:163) 
     at org.hibernate.action.EntityUpdateAction.postUpdate(EntityUpdateAction.java:200) 
     at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:179) 
     at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279) 
     at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263) 
     at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:168) 
     at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:32 
1) 
     at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50) 
     at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027) 
     at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:365) 
     at org.hibernate.ejb.AbstractEntityManagerImpl$1.beforeCompletion(AbstractEntityManagerImpl.java:504) 
     at com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple.beforeCompletion(SynchronizationImple.j 
ava:101) 
     at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.beforeCompletion(TwoPhaseCoordinator.java:269) 
     at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:89) 
     at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:177) 
     at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.ja 
va:1423) 
     at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:137) 
     at com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(BaseTransactionManagerDelegate.java:75) 
     at org.jboss.aspects.tx.TxPolicy.endTransaction(TxPolicy.java:170) 
     at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:87) 
     at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:190) 
     at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) 

回答

1

这与多个类加载器打交道时看起来像经典的Java继承问题。您是否曾尝试将jboss-classloading.xml添加到您的EAR META-INF/lib目录中?

<classloading xmlns="urn:jboss:classloading:1.0" 
       parent-first="false" 
       domain="DefaultDomain" 
       top-level-classloader="true" 
       parent-domain="Ignored" 
       export-all="NON_EMPTY" 
       import-all="true"> 
</classloading> 

你可能不得不开始包装休眠以及您依赖由应用服务器所提供的任何其他第三方库。

这似乎也是一个很好的资源http://phytodata.wordpress.com/2010/10/21/demystifying-the-jboss5-jboss-classloading-xml-file/