在linux中抛出IllegalAccessError(suse 10)

时间:2011-10-24 09:46:15

标签: class loading java

enter code here我们正在使用c3p0 jar进行数据库池化。现在从c3p0代码中,出现以下异常

引起:java.lang.IllegalAccessError:尝试从类com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource访问类com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource $ 1  at 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)

现在在AbstractPoolBackedDataSource.java中(第74行) PropertyChangeListener l = new 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 个答案:

答案 0 :(得分:1)

我已经使用一些反复试验解决了这个问题。

我也发现,这并不像我之前所怀疑的那样可靠。这很容易重现,看起来像一个潜在的类加载错误。(虽然我不确定它是在equinox实现还是在java !!)。

在解释解决方案之前,让我更详细地描述一下场景。

我们将代码部署在osgi(equinox)框架中。有两个捆绑包使用c3p0 jar进行数据库池化,其中一个捆绑包导出c3p0包。这个包在另一个包之前开始。

现在,根据osgi规范,osgi类加载器应该为单独的bundle维护单独的类加载器实例。现在当第二个包试图从c3p0 jar加载类时,它的类加载器可能会发现(来自父代理)已经加载了类!但它们是从不同的上下文加载的,这会导致访问冲突。

这是初步调查结果,我将尝试使用eclipse代码进行调试,并且可能会更深入地研究它。更改捆绑包开始订单后,即可解决此问题。