2011-10-24 40 views
1

enter code here我們正在使用c3p0 jar進行數據庫合併。現在來自c3p0代碼,以下異常正在進行中:IllegalAccessError投擲在Linux中(suse 10)

導致:java.lang.IllegalAccessError:嘗試從類com.mchange.v2.c3p0.impl訪問類com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource $ 1 .AbstractPoolBackedDataSource 在com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.setUpPropertyEvents(AbstractPoolBackedDataSource.java:74) 在com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource。(AbstractPoolBackedDataSource.java:63) 在com.mchange .v2.c3p0.ComboPooledDataSource(ComboPooledDataSource.java:109) 在com.mchange.v2.c3p0.ComboPooledDataSource。(ComboPooledDataSource.java:105)

現在AbstractPoolBac kedDataSource.java(線74) 的PropertyChangeListener升=新的PropertyChangeListener()

PropertyChangeListener l = new PropertyChangeListener() 
{ 
public void propertyChange(PropertyChangeEvent evt) 
{ resetPoolManager(); } 
}; 

所以,是的PropertyChangeListener內部類這裏.. AbstractPoolBackedDataSource $ 1 的PropertyChangeListener是Java類的java.beans.PropertyChangeListener !!

可能是什麼原因?這隻發生在Linux(suse 10)中。在Windows中它工作正常(jdk 1.6_10和jre 1.6_20)。我已經嘗試過不同的jdk,jre組合(jdk 1.6_25等)

回答

1

我已經使用一些試驗和錯誤解決了問題。

此外,我發現,這是不可靠的,因爲我早些時候懷疑。這很容易重現,看起來像一個潛在的類加載錯誤(儘管我不確定它是在equinox實現還是在java中!)。

在解釋解決方案之前,讓我更詳細地描述這個場景。

我們將我們的代碼部署在osgi(equinox)框架中。有兩個軟件包使用c3p0 jar進行數據庫池,其中一個軟件包導出c3p0軟件包。該捆綁包在另一個之前開始。

現在,根據osgi規範,osgi類加載器應該爲單獨的bundle維護單獨的類加載器實例。現在,當第二個bundle嘗試從c3p0 jar中加載類時,它的類加載器可能會從父代理程序中找到這些類已經加載了!但是它們是從不同的上下文中加載的,這會導致訪問衝突。

這是最初的調查結果,我會嘗試使用eclipse代碼進行調試,並且可能會更多地進行調查。更改包開始順序後,解決此問題。