Eclipse RCP: ClassNotFoundException или как заставить другой пакет загрузить мой класс

Подробности: я пытаюсь использовать структуру Jalapeno для подключения моего приложения RCP к базе данных Cache. После установления соединения я пытаюсь получить все данные из таблицы точно так же, как в руководстве по Jalapeno:

if (objManager==null) return;
DBClass cortege = null;
try {
Iterator terms = objManager.openByQuery(DBClass.class, null, null);
System.out.println("terms ok");
while (terms.hasNext()){
    System.out.println("has next");
    cortege = (DBClass)terms.next();
}

этот код компилируется, запускается и выдает исключение

java.lang.RuntimeException: myPluginId.views.DBClass
at com.intersys.objects.POJOIterator.next(POJOIterator.java:75)
   ...skip...
   Caused by: java.lang.ClassNotFoundException: myPlugin.views.DBClass
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at org.eclipse.core.runtime.internal.adaptor.ContextFinder.loadClass(ContextFinder.java:129)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClassInternal(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at com.jalapeno.runtime.ObjectCopierToPojo.detach(ObjectCopierToPojo.java:76)
    at com.jalapeno.runtime.ObjectCopierToPojo.findPojo(ObjectCopierToPojo.java:472)
    at com.intersys.classes.CacheRootObject.detach(CacheRootObject.java:255)
    at com.intersys.classes.Persistent.detach(Persistent.java:567)
    at com.intersys.objects.POJOIterator.next(POJOIterator.java:59)

в терминах.следующий();

Я вообще не могу это понять... экземпляр класса DBClass был только что создан, но класс не может быть загружен. затем я попытался поместить этот код в простое Java-приложение (не eclipse rcp), и все прошло нормально, поэтому я думаю, что какая-то часть Eclipse блокирует загрузку класса.

также я пытался загрузить класс перед вызовом terms.next();

Bundle b = Platform.getBundle("myPluginId");
try {
b.loadClass("DBClass");
} catch (ClassNotFoundException e) {
System.out.println("no class");
e.printStackTrace();
}

... и получил ту же ошибку. Класс не может быть загружен. Так это известная проблема? Есть ли решение?

Обновлять

После некоторых исследований, обновляющих вопрос:

Как заставить плагин Jalapeno загружать класс из моего плагина?


person Imaskar    schedule 26.03.2009    source источник
comment
в группе eclipse google обнаружил, что плагин Jalapeno и мой класс должны быть загружены одним и тем же загрузчиком классов... я не знаю, как это сделать.   -  person Imaskar    schedule 26.03.2009
comment
это то, что мне нужно? wiki.eclipse.org/index.php/BundleProxyClassLoader_recipe, если да, то как его использовать ?   -  person Imaskar    schedule 26.03.2009
comment
взгляните на мой ответ ниже, но да, я считаю, что вам нужна загрузка класса приятеля.   -  person nstehr    schedule 26.03.2009


Ответы (2)


Возможно, вы захотите попробовать загрузку классов приятеля. Для получения дополнительной информации о загрузке классов в Eclipse Алекс Блюитт написал отличный обзор системы загрузки классов в Eclipse здесь . Ему несколько лет, но по большей части он до сих пор актуален.

Суть загрузки класса приятеля такова:

  • плагин заявляет, что ему нужна помощь в загрузке классов. Он делает это, объявляя свой «плагин для друзей».

  • плагин друзей объявляет свою политику друзей

  • когда обычный механизм загрузки дает сбой, Eclipse пытается использовать указанные вами политики загрузки классов друзей.

Итак, в вашем случае попробуйте поставить:

Eclipse-BuddyPolicy: registered

в файле manifest.mf вашего плагина Jalapeno

и положи:

Eclipse-RegisterBuddy: id.of.jalepeno.plugin

в manifest.mf вашего плагина

person nstehr    schedule 26.03.2009
comment
Благодарность! Это помогло! Только одно: есть ли способ улучшить производительность, пропустить обычный механизм (я полагаю, он повторяет все классы в плагине Jalapeno) и сначала использовать загрузку приятелей (только в ожидаемых местах... Я имею в виду, где я знаю, что будет происходить загрузка приятелей )? - person Imaskar; 27.03.2009
comment
рад что помогло! Но что касается второго вопроса, я не могу придумать, как улучшить производительность. - person nstehr; 27.03.2009

Я не уверен, но возможно надо экспортировать пакет, в котором лежат классы.

Выберите в МАНИФЕСТЕ «Время выполнения» и добавьте все пакеты

person Markus Lausberg    schedule 26.03.2009