Недопустимая ошибка доступа в Linux (suse 10)

#class #loading #java

#класс #Загрузка #java

Вопрос:

enter code here мы используем c3p0 jar для объединения базы данных. Теперь из кода c3p0 возникает следующее исключение

Вызвано: java.lang.Ошибка незаконного доступа: пытался получить доступ к классу com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource за 1 доллар из класса com.mchange.v2.c3p0.impl.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)

Теперь в AbstractPoolBackedDataSource.java (строка 74) PropertyChangeListener l = новый 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 должен поддерживать отдельные экземпляры загрузчика классов для отдельных пакетов. Теперь, когда второй пакет пытается загрузить классы из c3p0 jar, его загрузчик классов может обнаружить (из родительского делегирования), что классы уже загружены!! Но они загружаются из другого контекста, что вызывает нарушение доступа.

Это первоначальные выводы, я попытаюсь выполнить отладку с помощью кода eclipse и, возможно, углублюсь в него. После изменения порядка запуска пакета это устранено.