2010-04-24 100 views
1

我有兩個耳朵部署在適當的classloaders隔離設置jboss。當seam bean調用對數據庫進行一些查詢的spring bean時,一切正常,但是當spring調用quartz並且執行嘗試執行數據庫查詢時,會出現問題,因爲spring試圖從其他耳朵使用hibernate jar並引發異常!很明顯,spring classloader隔離問題。有沒有人遇到過這樣的問題?如何確保隔離?jboss上彈簧classloader隔離問題

回答

0

我打賭,SEAM使用的Hibernate JAR來自JBOSS類加載器,它在任何EAR類加載器之前調用。發生這種情況是因爲SEAM與JBOSS捆綁在一起。

EAR中的Spring使用的是不同版本的Hibernate JAR或它的依賴關係,因此會發生衝突。

您必須從JBOSS中刪除Hibernate JAR,以便它不再可見於應用程序服務器類加載器,但這可能會破壞SEAM。

您可能會看到JBOSS是否有任何方式告訴應用程序服務器在EAR配置中將應用程序級別的JAR更傾向於服務器JAR。

0

假設JBoss 4.x,然後在deploy/ear-deployer.xml文件中,確保啓用了類加載器隔離,例如,

<server> 
    <mbean code="org.jboss.deployment.EARDeployer" name="jboss.j2ee:service=EARDeployer"> 
     <attribute name="Isolated">true</attribute> 
     <attribute name="CallByValue">false</attribute> 
     <attribute name="EnablelibDirectoryByDefault">true</attribute> 
    </mbean> 
</server> 

這將阻止一個EAR中的類對另一個EAR可見。出於某種原因,默認設置爲Isolation=false

這可能就足夠了。但是,您可能還需要增加一個jboss-app.xml文件中的EAR的META-INF目錄,包含這樣的事情:

<jboss-app> 
    <loader-repository>MyCompany:loader=MyApplication</loader-repository> 
</jboss-app> 

我不知道,這確實還是什麼使用它,但在某些情況下,它似乎加強EAR之間的隔離。