Обычная версия
Java форум JavaTalks
форум программистов

Поиск   Пользователи   Группы   Регистрация 
 Профиль   Личные сообщения 

 Вход 

Java приложение с поддержкой плагинов
Список форумов
 ->  Отражение (Reflection API)


На страницу 1, 2  След. 
Начать новую тему 
Предыдущая тема :: Следующая тема  
Автор Сообщение
x8m6 : 104
Новичок

СообщениеМар 02, 2010 2:22 
Ответить с цитатой
Меня давно интересует, как используя только стандартные средства языка Java (без привлечения дополнительных библиотек и фреймворков, таких как OSGi) написать расширяемое приложение, т.е. приложение для которого в любой момент времени может быть расширена его функциональность путем написания дополнительного модуля (плагина), при этом само приложение не должно изменятся(изменение исходного кода приложения и его перекомпиляция) . Я так понимаю в ядре должны быть определены какие то интерфейсы, которым плагин должен следовать... Сам плагин выглядит как Jar-архив и загружается в ядро через рефлексию... Как ограничить доступ плагина к ядру... Как написать ту часть ядра которая управляет плагинами.. и.т.д. Кто нибудь занимался подобными вещами?
К началу Посмотреть профиль Отправить личное сообщение
Vlad : 1670
JavaTalks Team Member
Откуда: ODS-KRK-LON-HFE

СообщениеМар 02, 2010 4:05 
Ответить с цитатой
В простейшем случае из рефлексии может понадобиться только Class.newInstance() или Constructor.newInstance(). Главная часть - это определение интерфейсов, которые будут опрделять раширяемые плагинами точки; потом работа с файловой системой и др. хранилищами (см. класс java.io.File, java.net.URL - определения классов могут хранится не только в файле, а напр., и в БД и т.п.), jar-архивами (см. классы в пакете java.util.jar.*); потом загрузка классов (см. Class.forName(), ClassLoader / URLClassLoader).

Уверен, в нете можно нагуглить примеры реализации плагинной архитектуры.
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора
sgdread : 2184
JT Библиотекарь
Откуда: USA

СообщениеМар 02, 2010 12:08 
Ответить с цитатой
Я делал рефлекшеном. С конфигом модулей в проперти-файлах.
Можно также сканировать на наличие аннотации, тогда проперти-файлы не нужны.
_________________
К началу Посмотреть профиль Отправить личное сообщение
x8m6 : 104
Новичок

СообщениеМар 02, 2010 15:44 
Ответить с цитатой
Цитата:
Главная часть - это определение интерфейсов, которые будут опрделять раширяемые плагинами точки

А поподробнее можно как их определить и как назначить расширяемые точки?

И что ещё должно включатся в Plugin API кроме, самих интерфейсов, которые должен будет реализовать разработчик плагина? Т.е. кроме интерфейсов в API должна быть включена какая-то часть спецификации ядра?
К началу Посмотреть профиль Отправить личное сообщение
Староверъ : 7620
Ктапубеп
Откуда: Elfland

СообщениеМар 02, 2010 16:00 
Ответить с цитатой
Может пригодиться - OSGI (идею украсть, например Wink)
К началу Посмотреть профиль Отправить личное сообщение Отправить e-mail
aleksandy : 1077
Завсегдатай

СообщениеМар 09, 2010 11:29 
Ответить с цитатой
Вот тут очень неплохо расписано простейшее java-приложение с плагинами.
К началу Посмотреть профиль Отправить личное сообщение
x8m6 : 104
Новичок

СообщениеМар 09, 2010 14:24 
Ответить с цитатой
aleksandy, статья конечно хорошая, спасибо, но там не затрагиваются вопросы взаимодействия между плагинами, т.е. как воспользоваться функциональностью, написанной в других плагинах, проектируя свой.
К началу Посмотреть профиль Отправить личное сообщение
almagnit : 938
Модератор
Откуда: Луганск

СообщениеМар 09, 2010 17:07 
Ответить с цитатой
Цитата:
т.е. как воспользоваться функциональностью, написанной в других плагинах, проектируя свой

Vlad писал(а):
Главная часть - это определение интерфейсов, которые будут опрделять раширяемые плагинами точки;

Для этого нужно знакомиться с шаблонами проектирования, чтобы не конструировать свой "трехколесный" Smile
К началу Посмотреть профиль Отправить личное сообщение ICQ Number
x8m6 : 104
Новичок

СообщениеМар 09, 2010 20:16 
Ответить с цитатой
Цитата:
Для этого нужно знакомиться с шаблонами проектирования, чтобы не конструировать свой "трехколесный"

Какие же шаблоны подойдут в моем случае?
К началу Посмотреть профиль Отправить личное сообщение
aleksandy : 1077
Завсегдатай

СообщениеМар 09, 2010 20:45 
Ответить с цитатой
x8m6 писал(а):
как воспользоваться функциональностью, написанной в других плагинах, проектируя свой.

Ну, если использовать терминологию из приведенной мною статьи, тогда это можно сделать через PluginContext
К началу Посмотреть профиль Отправить личное сообщение
almagnit : 938
Модератор
Откуда: Луганск

СообщениеМар 09, 2010 22:29 
Ответить с цитатой
Посмотрите реализации структурных шаблонов.
К началу Посмотреть профиль Отправить личное сообщение ICQ Number
x8m6 : 104
Новичок

СообщениеМар 10, 2010 1:47 
Ответить с цитатой
aleksandy, PluginContext связывает основное приложение с плагином. Мне же нужно связать плагины между собой.

almagnit, посмотрел но не совсем понял как их использовать в моем случае...
Я хочу реализовать примерно так как это сделано в Эклипс.
Там каждый плагин сам в себе определяет несколько точек расширения - т.е. несколько интерфейсов и/или классов(скорее всего абстрактных) из своей логики которые смогут расширить другие плагины. Эти классы прописываются в ядре и от туда их можно как то выгрузить - т.е. как то предоставить в виде SDK для разработчиков плагинов(пока непонятно как). Разработчик плагина смотрит в среде, к которому подключено ядро с загруженными плагинами, список точек расширения и выбирает ему нужные. После этого среда генерит ему SDK с нужными ему классами и интерфейсами. Далее он подключает этот SDK к своему проекту и создает там свой плагин.
Также я хочу ввести кроме точек расширения , точки использования - т.е. конкретные реализации классов, которые могут и/или должны быть использованы в других плагинах (например, в одном плагине определен класс для работы с матрицами Matrix, несколько интерфейсов которые могут быть расширены в других плагинах и др. классы. И эти интерфейсы имеют зависимость от класса Matrix. Тогда чтобы реализовать эти интерфейсы в других плагинах нужно обязательно знать что такое тип данных Matrix, а значит класс Matrix тоже должен быть включен в поставляемый SDK, но класс Matrix также может иметь зависимости от других классов, получается что нужно тянуть в SDK кучу всего - нехорошо. Как быть? ).
Таким образом в плагине определяются:
- точки расширения;
- точки использования (как правильно их выбирать? Что бы они имели минимум зависимоcтей?);
- расширения точек других плагинов.

Насколько сложно это сделать на Java и как правильно формировать SDK?
К началу Посмотреть профиль Отправить личное сообщение
Jean : 1992
JavaTalks Team Member
Откуда: Санкт-Петербург

СообщениеМар 10, 2010 2:42 
Ответить с цитатой
Так ведь таким образом все и тянется. Если ваши плагины зависят каким-то образом от Matrix, а он, в свою очередь, еще от чего-то зависит, то ваши плагины косвенно зависят от этого "еще чего-то".
Если Matrix не имеет смысла без использования того, от чего он зависит, а определенные для расширения интерфейсы зависят от Matrix, то невозможно будет реализовать эти интерфейсы так, чтобы получить нужную функциональность, т.е. обработать что-то, что наследует от Matrix.

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

Если вас интересует терминология, то IoC, Dependency Injection - отвязывают классы друг от друга, но связь тем не менее существует либо в аннотациях, либо в каких-то конфигурационных файлах. Фактически, иначе и не может быть. Если один ваш класс требует для работы другой, то как-то эту связь выразить нужно.
_________________
Всякое решение плодит новые проблемы
К началу Посмотреть профиль Отправить личное сообщение
evillive : 810
Постоянный посетитель

СообщениеМар 10, 2010 3:52 
Ответить с цитатой
Вы хотите построить довольно сложную систему с нуля. Почему бы не воспользоваться одной из реализаций OSGi - будет вам все как в эклипс? Еще посмотрите на Netbeans Platform - имхо попроще чем OSGi, но при этом полноценная модульная платформа.
Цитата:

Эти классы прописываются в ядре и от туда их можно как то выгрузить - т.е. как то предоставить в виде SDK для разработчиков плагинов(пока непонятно как).

Что значит "выгрузить"? Как должно выглядеть SDK в вашем понимании?
Цитата:

Тогда чтобы реализовать эти интерфейсы в других плагинах нужно обязательно знать что такое тип данных Matrix, а значит класс Matrix тоже должен быть включен в поставляемый SDK, но класс Matrix также может иметь зависимости от других классов, получается что нужно тянуть в SDK кучу всего - нехорошо. Как быть?

Сложно что-то сказать без ответа на предыдущий вопрос.

И, еще, точки расширения и использования. Из того, как вы их описали я не понял разницы между ними.
В моем понимании точка расширения - это то, что позволяет одному модулю изменить функциональность/внешний вид другого (ядро приложения тоже можно считать модулем). Например модуль "Меню" предоставляет API, с помощью которого другие модули могут добавлять свои пункты меню или скрывать чужие.
Обычное API модуля (Ваша точка использования) - это просто API, который может быть использован другими модулями как сервис. Например как ваш API для работы с матрицами.

Вот еще ссылочка по теме стандартных средств Java: Service Provider Interface: Creating Extensible Java Applications
К началу Посмотреть профиль Отправить личное сообщение
aleksandy : 1077
Завсегдатай

СообщениеМар 10, 2010 6:07 
Ответить с цитатой
x8m6 писал(а):
Мне же нужно связать плагины между собой.

Я, конечно, могу ошибаться, но в моем понимании, если один какой-то плагин зависит от другого, то этот другой является для него как бы "основным приложением".
К началу Посмотреть профиль Отправить личное сообщение
 
Начать новую тему  Ответить на тему
Страница 1 из 2
На страницу 1, 2  След.
Список форумов
 -> Отражение (Reflection API)


 
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Java and all Java-related trademarks and logos are trademarks or registered trademarks of Oracle Corporation in the United States and other countries.
Это сайт не относится к фирме Oracle Corporation и не поддерживается ею.

© 2006-2010 www.javatalks.ru: форум java программистов
Используется скрипт phpBB © 2001, 2010 phpBB Group

Хостинг от bizname.ru