Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / поделитесь опытом: плагины / 10 сообщений из 10, страница 1 из 1
12.05.2006, 16:39
    #33723572
kadet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поделитесь опытом: плагины
коллеги поделитесь плз опытом.

нужно оформить проект таким образом, чтоб можно было позже к нему подключать плагины (другими словами добавить дополнительную функциональность, например печать).
Мне бы хотелось разобраться и понять каким образом строить проект чтоб эта возможность была реализованна. Еклипса в этом смысле хорошо организованна: кидаешь в папку jar-архив и при следующем старте он уже подключен и его можно видеть, например через меню.
Как бы не ясно в какой форме должны эти плагины представлятся. Логично их оформлять в виде Bean-компонента, но как правильно это сделать? Посоветуйте плз.
...
Рейтинг: 0 / 0
12.05.2006, 17:19
    #33723711
ddddiiiiimmmmaaaa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поделитесь опытом: плагины
Посмотри на фреймворк OSGI - на нем Eclipse написан
...
Рейтинг: 0 / 0
12.05.2006, 17:55
    #33723833
Kudinov Anton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поделитесь опытом: плагины
Можешь посмотреть фреймворк jpf - Java Plugin Framework
...
Рейтинг: 0 / 0
06.06.2006, 11:53
    #33774309
kadet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поделитесь опытом: плагины
ознакомился и поигрался с JPF. В принципе даже понравилось.
Вот только дополнительно информации не могу найти.
Может кто знает как из одного плагина достучатся до классов другого. Не знаю как это выполнить.
...
Рейтинг: 0 / 0
07.06.2006, 10:39
    #33776785
Kudinov Anton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поделитесь опытом: плагины
Нужно в манифесте одного плагина вставить

<requires>
<import plugin-id="Другой плагин"/>
</requires>
И будешь иметь доступ к классам другого плагина
А для компиляции добавь в build файл в classpath
строчку
<dirset dir="${plugins.home}" includes="другой плагин-*/classes"/>

И все будет работать.
Вообще в демке все достаточно хорошо описано
...
Рейтинг: 0 / 0
07.06.2006, 13:58
    #33777715
kadet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поделитесь опытом: плагины
спасибо,
потренируюсь.
...
Рейтинг: 0 / 0
07.06.2006, 21:00
    #33779042
kadet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поделитесь опытом: плагины
Я читал туториал JPF-Проекта. Там конечно же поясняется что означают теги
Код: plaintext
1.
2.
3.
<requires>
 < import  plugin-id="Другой плагин"/>
 </requires>
а так же в частности
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
<runtime>
		<library id="dbbrowser" path="classes/" type="code">
			<doc caption="API documentation">
				<doc-ref path="api/index.html" caption="javadoc"/>
			</doc>
			<export prefix="*"/>
		</library>
		<library type="resources" path="icons/" id="icons"/>
</runtime>
ясно,что в данном примере классы надо искать в папке "classes" каталога плагина и что все классы видимы для других классов (<export prefix="*"/>)

Больше всего мне непонятно каким образом из одного плагина достигают классов другого исходя из предположения, что фактически каждый плагин - это абсолютно самостоятельная сущность и то, что на этапе компиляции какого-то плагина фактически не известно о существовании классов другого плагина. Смею предположить, что где-то должен быть общий знаменатель, вероятнее всего - это сам "материнский проект", который и запускает все плагины. Т.о. следует вывод, что все классы становятся видимыми только на этапе выполнения проекта.
Вот тут то я и спотыкаюсь: мне как раз то и надо достучатся до классов другого плагина именно на этапе компиляции.
Вероятно я совершил где-то логическую ошибку и немного "торможу".
Буду очень благодарен за "отмычку".

В примерах плагинов JPF-проекта я заметил существование файлов "build.xml", но к сожалению никакого описания в проекте этих файлов я не нашел, за исключением, пожалуй, момента где описывается подключение JPF-Demo к Netbean IDE. Вероятно это действительно файлы проекта NetBean. Я же работаю с эклипсой и поэтому предложение коллеги
Kudinov Anton
касательно строчки
<dirset dir="${plugins.home}" includes="другой плагин-*/classes"/>
не имеют реальной силы для меня.

Я был бы искренне благодарен за фрагмент кода

PS
должен ли я проектировать плагин именно в рамках уже существующего материнского проекта или все-таки выполнять его как абсолютно самостоятельный прект?

всетаки фрагмент кода мог бы прояснить ситуацию.
...
Рейтинг: 0 / 0
08.06.2006, 10:08
    #33779597
Kudinov Anton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поделитесь опытом: плагины
Я сам работаю в eclipse
проекты jpf собираются ant'ом

Есть главный build.xml файл и есть build.xml файлы для каждого плагина.
Чтобы собрать проект нужно выполнить ant для главного build файла

Чтобы работать с проектом нужно чтобы все исходники подключались в eclipse как папки исходников.

Для того чтобы работать с классами другого плагина нужно чтобы он реализовывал интерфейс точки расширения плагина и можно его использовать

Код: plaintext
1.
2.
		Plugin plugin = getManager().getPlugin("netcomp.provider.jms");
		TransportProvider provider = (TransportProvider) plugin;

Вообще скачай себе demo и попробуй его установить и погонять чтобы разобраться
...
Рейтинг: 0 / 0
08.06.2006, 16:51
    #33781287
kadet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поделитесь опытом: плагины
спасибо, поковыряюсь еще.
демо я сразу скачал, но вероятно еще не все основытельно "проел".
...
Рейтинг: 0 / 0
15.06.2006, 14:11
    #33792949
kadet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поделитесь опытом: плагины
Простите коллеги, что то я не "догоняю".
Я работаю на eclipse.
Проблема в теории, я не могу понять следующий момент.
Допустим имеем некоторый плагин, назовем его "База данных"(id="connection"). Допустим он имеет следующий plugin.xml:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
<?xml version="1.0" ?>
<!DOCTYPE plugin  PUBLIC  "-//JPF//Java Plug-in Manifest 0.4" "http://jpf.sourceforge.net/plugin_0_4.dtd">
<plugin id="connection" version="0.0.4">
	<requires>
		< import  plugin-id="sceleton"/>
	</requires>
	<runtime>
		<library id="connection" path="classes/" type="code">
			<doc caption="API documentation">
				<doc-ref path="api/index.html" caption="javadoc"/>
			</doc>
			<export prefix="*"/>
		</library>
	</runtime>
	<extension plugin-id="sceleton" point-id="Tool" id="db">
		<parameter id="class" value="connection.Kgw"/>
		<parameter id="name" value="TestPanel"/>
		<parameter id="description" value="Testing plugin"/>
		<parameter id="icon" value="codecolorer.gif"/>
	</extension>
</plugin>
из него видно, что этот плагин "нуждается" в плагине "sceleton" (<import plugin-id="sceleton">) и испоьзует во время работы библиотеку "connection". Библиотека "connection" имеет префикс "*" (<export prefix="*">). Из этого я
делаю вывод, что библиотека "connection" предоставляет все свои "потроха"
для использования в других плагинах.

Далее я создаю другой плагин, назовем его "family".Из этого плагина я хочу
обращаться к классам плагина "БазеДанных". Предположим он имеет такой plugin.xml:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
<?xml version="1.0" ?>
<!DOCTYPE plugin  PUBLIC  "-//JPF//Java Plug-in Manifest 0.4" "http://jpf.sourceforge.net/plugin_0_4.dtd">
<plugin id="family" version="0.0.4"  class ="family.Hello">
	<requires>
		< import  plugin-id="sceleton"/>
		< import  plugin-id="connection"/>
	</requires>
	<runtime>
		<library id="family" path="classes/" type="code">
			<doc caption="API documentation">
				<doc-ref path="api/index.html" caption="javadoc"/>
			</doc>
			<export prefix="*"/>
		</library>
		
	</runtime>
	<extension plugin-id="sceleton" point-id="Tool"  id="hello">
		<parameter id="class" value="family.Hello"/>
		<parameter id="name" value="TestPanel"/>
		<parameter id="description" value="Testing plugin"/>
		<parameter id="icon" value="codecolorer.gif"/>
	</extension>
</plugin>

Из него видно, что для работы этого плагина ("family") требуется два
других плагина:
Код: plaintext
1.
2.
3.
<requires>
		< import  plugin-id="sceleton"/>
		< import  plugin-id="connection"/>
</requires>
а так же библиотека "family". Кроме прочего у меня есть некоторый класс
family.Hello (<parameter id="class" value="family.Hello"/>), который
действительно запускается материнским проектом (в терминах JPF - ApplicationPlugin) в качестве плагина.

Вот теперь вопросы:
1. что(кто) и на каком этапе выполняет подключение необходимых плагинов

Код: plaintext
1.
2.
3.
<requires>
		< import  plugin-id="sceleton"/>
		< import  plugin-id="connection"/>
</requires>
2. Если плагин "БазаДанных" действительно подключился, то в моем классе
(family.Hello), я должен иметь доступ к классам плагина "БазаДанных", после
того, как сам плагин "family" загрузился. Это означает, что когда мой класс
family.Hello существует, он может обращаться к классам "БазыДанных". Но вот
как выражается это подключение, каким должен быть код? - не понимаю.

Если я просто использую конструкцию в family.Hello:
Код: plaintext
Plugin plugin = getManager().getPlugin("connection");
то она просто не работает, т.к. на момент загрузки класса family.Hello - getManager() возвращает null: в момент врмени, когда происходит присоединение
"расширения"класс PluginManager (возвращаемый getManager()) уже не
работоспособен.
Т.о. вообще не ясно как достучатся до классов плагина "БазаДанных" и как
функционирует механизм
Код: plaintext
< import  plugin-id="connection"/>
Если я, например, напрямую импортирую в моем family.Hello всю библиотеку плагина "БазаДанных" (через настройки проекта)
то весь механизм, реализованный в конструкции
Код: plaintext
1.
2.
<requires>
		< import  plugin-id="connection"/>
</requires>
просто теряет смысл ?

После долгих изучений, я обнаружил, что можно дотянутся до классов другого плагина только на этапе загрузки плагина, когда вызывается метод doStart() ( для этого мы указываем в объявлении плагина атрибут class: <plugin id="family" version="0.0.4" class="family.Hello">). Это выглядит таким образом (это фрагмент класса family.Hello из плагина family):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
	ExtensionPoint extPoint = getManager().getRegistry().getExtensionPoint(
				"sceleton", "Tool");
	Extension ext = extPoint.getConnectedExtension("connection@db");//connection@db - это идентификационный номер "БазаДанных"
	PluginDescriptor dpd = ext.getDeclaringPluginDescriptor();
	Library library=dpd.getLibrary("connection");//
	
	Iterator<String> iterResource=library.getExports().iterator();
		 while (iterResource.hasNext()){
			String resName=iterResource.next();
			Kgw kgw; // !!!!!  это класс из плагина "БазаДанных" !!!!!
			 try  {
				kgw = (Kgw) Class .forName(resName).newInstance();
				out.println("resource:\t"+kgw);
			}  catch  (Exception e) {
				e.printStackTrace();
			
			 break ;
		}
	
в общем все проходит на "ура". Но при этом конструкция
Код: plaintext
1.
2.
<requires>
		< import  plugin-id="connection"/>
</requires>
опять же не работает. В чем ее смысл. Я просто исключил эту строчку (<import plugin-id="connection"/>) из файла plugin.xml плагина family и этот фрагмент кода так же сработал.

Коллеги, научите плз, где сабака зарыта?
Как все таки правильно дотягиваться до классов другого плагина.
Играет ли ант здесь ключевую роль ?

PS
работаю на эклипсе.
Предварительно изучил ANT,и понял, что ант предназначен для сборки проекта. Но эклипс сам это делает, мне бы запустить все под эклипсой.

класс Hello:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
 package  family;

 import   static  java.lang.System.out;
 import  java.util.Iterator;
 import  org.java.plugin.registry.*;
 import  connection.Kgw;


 public   class  Hello  extends  org.java.plugin.Plugin {
	 public   void  doStart(){
		 this .init();
	}
	 public   void  doStop(){;}
	 public  Hello(){;}
	
	
	 public   void  init() {
		ExtensionPoint extPoint = getManager().getRegistry().getExtensionPoint(
				"sceleton", "Tool");
		//getConnectedExtension erwartet eine UniqueID von Extension
		Extension ext = extPoint.getConnectedExtension("connection@db");
		PluginDescriptor dpd = ext.getDeclaringPluginDescriptor();
		Library library=dpd.getLibrary("connection");
		
		Iterator<String> iterResource=library.getExports().iterator();
		 while (iterResource.hasNext()){
			String resName=iterResource.next();
			Kgw kgw;
			 try  {
				kgw = (Kgw) Class .forName(resName).newInstance();
				out.println("resource:\t"+kgw);
			}  catch  (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			 break ;
		}
	}
}
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / поделитесь опытом: плагины / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]