2011-08-23 95 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/