IgorDanilov
1

Разработка плагина (ClassCastException)

14.10.2009, 16:01. Показов 2200. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Проблема состоит в следующем. Пытаюсь написать ядро, к которому можно подключать плагины. Первым делом запускается класс Bosstrap который загружает интерфейс плагина в classloader, наследуемый от Boostrap classloaderа, самого корневого в иерархии. Этот classloader называется commonsLoader. Затем от commonsLoader наследуется еще один classloader, который называется appLoader. В appLoader загружаются ядро и плагины. Вообщем, интерфейс должен быть видим и ядру и плагинам. Схема:
Bosstrap -> commonsLoader(интерфейс) -> appLoader (ядро и плагины)
однако ядро (или основное приложение) состоит из нескольких классов(в том числе PluginInfo). а я загружаю в appLoader только один класс - Core. и когда в Core создается объект класса PluginInfo, он по-видимому загружается стандартным classloader java, который не видит интерфейс, так как наследован от Boostrap.
Соответственно возникает ClassCastException на строке кода (из класса) PluginInfo:

Java
1
instance = (BasePluginInterface) pluginClass.newInstance();
Выход, о котором я подумал - это загружать все классы основного приложения в одном classloader, но здесь у меня снова ошибка - "Класс не найден", когда загружаю класс Core в класслоадер.
Вобщем вот Boostrap в первом варианте, когда загружаю только класс Core:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Boostrap { 
 
public static void main(String[] args) throws MalformedURLException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException { 
 
File commonsDir = new File("commons"); 
 
File[] entries = commonsDir.listFiles(); 
URL[] urls = new URL[entries.length]; 
 
for (int i = 0; i < entries.length; i++) { 
urls[i] = entries[i].toURI().toURL(); 
} 
 
URLClassLoader commonsLoader = new URLClassLoader(urls, null); 
 
URL binDirURL = new File("bin").toURI().toURL(); 
URLClassLoader appLoader = new URLClassLoader(new URL[]{binDirURL}, commonsLoader); 
 
Class appClass = appLoader.loadClass("programkernel_v01.Core"); 
Object appInstance = appClass.newInstance(); 
 
} 
 
}

Посоветуйте пожалуйста, что делать, чтобы подключить плагины.
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.10.2009, 16:01
Ответы с готовыми решениями:

Непонятный ClassCastException
Доброго времени суток! :) Подгружаю класс во время выполнения. Получаю следующую ошибку:...

ClassCastException in Deserialization
Привет всем. Подскажите почему здесь проблема возникает?! Есть клиент-серверное приложение -...

java.lang.ClassCastException & DefaultListModel
Почему возникает ошибка в этой строке? DefaultListModel m = (DefaultListModel) list.getModel();...

Java.lang.ClassCastException - что такое?
Exception in thread &quot;AWT-EventQueue-0&quot; java.lang.ClassCastException: java.lang.String cannot be...

1
36 / 36 / 10
Регистрация: 04.02.2010
Сообщений: 82
04.02.2010, 17:53 2
Если ещё актуально
Я так понимаю, речь идёт о вот этом примере: http://voituk.kiev.ua/2008/01/14/java-plugins/

1. Чтоб при загрузке Core не случалось "Класс не найден" нужно всего лишь для binDirURL уточнить путь к файлу с твоим основным классом. То есть сейчас:
Java
1
URL binDirURL = new File("bin").toURI().toURL();
а должно быть, например:
Java
1
URL binDirURL = new File("bin/MainApp.jar").toURI().toURL();
Видимо, автор статьи просто упустил этот момент.

Если не хочется хардкодить, но при этом уверен, что в папке bin будет только этот джарник, то можно вот так:
Java
1
URL binDirURL = new File("bin").listFiles()[0].toURI().toURL();
Если такой уверенности нет (могут быть и другие джарники), то можно вот так:
Java
1
2
3
4
5
6
7
File binDir = new File("bin");
URL[] binDirUrls = new URL[binDir.listFiles().length];
 
for (int i = 0; i < binDir.listFiles().length; i++) {
      binDirUrls[i] = binDir.listFiles()[i].toURI().toURL();
}
URLClassLoader appLoader = new URLClassLoader(binDirUrls, commonsLoader);


2. Про плагины. Тут, скорее всего, такая ошибка:
В методе
Java
1
 public PluginInfo(File jarFile) throws PluginLoadException {...}
создание класслодера должно выглядеть так:
Java
1
URLClassLoader classLoader = new URLClassLoader(new URL[]{jarURL}, this.getClass().getClassLoader().getParent());
Это в статье оговаривается, но если просто копипастить код, то можно пропустить второй параметр.


3. Загляни в подключаемые тобой джарники с интерфейсом плагинов, ядром (те которые plugin-api.jar, core.jar и тп). Если в коде написано
Java
1
Class appClass = appLoader.loadClass("programkernel_v01.Core");
то файлик "Core.class" обязан лежать не в корне джарника, а в папке с именем "programkernel_v0", которая в свою очередь уже сама в корне джарника. То же самое касается и плагинов и всего остального.


ЗЫ: сам недавно изучал эту статью и столкнулся с той же проблемой, гугленье навело на этот пост
0
04.02.2010, 17:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.02.2010, 17:53
Помогаю со студенческими работами здесь

Ошибка Looking for messag center service Error - java.lang.ClassCastException: sun.rmi.registry.RegistryImpl_Stub cannot be cast to
Помогите, пожалуйста, я новичок в Java, и пробовала изменить но не получается. За ранее спс!...

Java.lang.ClassCastException: MyBaza.Diag cannot be cast to java.lang.Comparable
Подскажите как исправить... Exception in thread &quot;AWT-EventQueue-0&quot; java.lang.ClassCastException:...

Joomla 3.5 VM 3.0.6 Разработка плагина для VM
Всем доброго времени суток. Столкнулся с такой проблемой... на странице производителя, нужно...

Разработка плагина для QtCreator
Никак не могу найти какой класс отвечает за эту панель, нужно чтобы плагин создал такое дерево для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru