2011-10-24 10 views
1

enter code here私たちはデータベースプール用にc3p0 jarを使用しています。今度はc3p0コードから、次の例外がありますIllegalAccessError in Linux(投機10)

原因:java.lang.IllegalAccessError:クラスcom.mchange.v2.c3p0.implからクラスcom.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource $ 1にアクセスしようとしましたcom.mchange.v2.c3p0.impl.AbstractPoolBackedDataSourceでcom.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.setUpPropertyEvents(AbstractPoolBackedDataSource.java:74) で.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 1 =新しいの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

私はいくつかの試行錯誤を使用して問題を解決しました。

また、これは私が以前の疑いがあるので、信頼できるものではありません。これは簡単に再現可能で、潜在的なクラスローディングバグのように見えます(しかし、私はそれが春分の実装かjavaかどうかはわかりません!!)。

解決策を説明する前に、このシナリオをより綿密に説明しましょう。

私たちのコードは、osgi(春分)フレームワークにデプロイされています。データベースプーリングにc3p0 jarを使用する2つのバンドルがあり、そのうちの1つがc3p0パッケージをエクスポートします。このバンドルは他のバンドルの前に開始します。

osgi仕様によれば、osgiクラスローダーは、別々のバンドル用に別々のクラスローダーインスタンスを保持する必要があります。 2番目のバンドルがc3p0 jarからクラスをロードしようとすると、そのクラスローダーはクラスがすでにロードされていることを(親の委譲から)見つけることができます!!しかし、それらは異なるコンテキストから読み込まれ、アクセス違反の原因となっています。

これは初期の調査結果であり、私はEclipseコードでデバッグしようとしています。バンドルの開始順序を変更した後、これが解決されます。