|
Java форум JavaTalks форум программистов
|
|
|
|
| Предыдущая тема :: Следующая тема |
| Автор |
Сообщение |
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 (идею украсть, например ) |
|
|
|
 |
aleksandy : 1077 Завсегдатай
|
Мар 09, 2010 11:29 |
|
|
| Вот тут очень неплохо расписано простейшее java-приложение с плагинами. |
|
|
|
 |
x8m6 : 104 Новичок
|
Мар 09, 2010 14:24 |
|
|
| aleksandy, статья конечно хорошая, спасибо, но там не затрагиваются вопросы взаимодействия между плагинами, т.е. как воспользоваться функциональностью, написанной в других плагинах, проектируя свой. |
|
|
|
 |
almagnit : 938 Модератор Откуда: Луганск
|
Мар 09, 2010 17:07 |
|
|
| Цитата: |
| т.е. как воспользоваться функциональностью, написанной в других плагинах, проектируя свой |
| Vlad писал(а): |
| Главная часть - это определение интерфейсов, которые будут опрделять раширяемые плагинами точки; |
Для этого нужно знакомиться с шаблонами проектирования, чтобы не конструировать свой "трехколесный"  |
|
|
|
 |
x8m6 : 104 Новичок
|
Мар 09, 2010 20:16 |
|
|
| Цитата: |
| Для этого нужно знакомиться с шаблонами проектирования, чтобы не конструировать свой "трехколесный" |
Какие же шаблоны подойдут в моем случае? |
|
|
|
 |
aleksandy : 1077 Завсегдатай
|
Мар 09, 2010 20:45 |
|
|
| x8m6 писал(а): |
| как воспользоваться функциональностью, написанной в других плагинах, проектируя свой. |
Ну, если использовать терминологию из приведенной мною статьи, тогда это можно сделать через PluginContext |
|
|
|
 |
almagnit : 938 Модератор Откуда: Луганск
|
Мар 09, 2010 22:29 |
|
|
|
|
|
|
 |
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) |
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|