|
|
Java форум JavaTalks форум программистов
|
|
|
|
|
|
|
| Предыдущая тема :: Следующая тема |
| Автор |
Сообщение |
x8m6 Новичок
Зарегистрирован: 10.12.2008 Сообщения: 70
|
Добавлено: Мар 10, 2010 20:05 Заголовок сообщения: RE: Java приложение с поддержкой плагинов |
|
|
| Цитата: |
Jean
Если Matrix не имеет смысла без использования того, от чего он зависит, а определенные для расширения интерфейсы зависят от Matrix, то невозможно будет реализовать эти интерфейсы так, чтобы получить нужную функциональность, т.е. обработать что-то, что наследует от Matrix.
evillive
Что значит "выгрузить"? Как должно выглядеть SDK в вашем понимании?
|
Ну вот как раз в этом вся и соль. Как автоматически выявить все эти зависимости и потом собрать всё вместе и отдать разработчику для использования (предполагается что разработка плагина - это отдельный самостоятельный проект, никак не привязанный к той среде/основному приложению с ядром в котором будущий плагин будет исполнятся. Поэтому будущему разработчику плагина нужен Plugin SDK/API, который в зависимости от его потребностей должна сформировать среда -т.е она должна найти файлы (на диске) нужных классов, интерфейсов и их зависимостей и скопировать их в один Jar-ник например, который и будет является чем то вроде SDK).
Есть немного другой неавтоматический сценарий для плагин-девелопера :
Он выясняет какие части ему нужно расширить и сам узнает в каких плагинах эти части находятся. Далее он просто идет в папку с плагинами и копирует нужные Jar для своего проекта.
Какой вариант лучше?
| Цитата: |
И, еще, точки расширения и использования. Из того, как вы их описали я не понял разницы между ними.
В моем понимании точка расширения - это то, что позволяет одному модулю изменить функциональность/внешний вид другого (ядро приложения тоже можно считать модулем). Например модуль "Меню" предоставляет API, с помощью которого другие модули могут добавлять свои пункты меню или скрывать чужие.
Обычное API модуля (Ваша точка использования) - это просто API, который может быть использован другими модулями как сервис. Например как ваш API для работы с матрицами.
|
Да, именно так. Одно API только для решения функционала, другое API для использования (но и расширить его тоже при желании можно).
2-ое отличается от 1-ого тем что это уже не просто набор "голых" абстракций, а уже вполне конкретизированные сущности, которые могут быть полезны в чём-то.
К примеру в ядре есть абстрактная модель со списком абстрактных объектов . И есть несколько плагинов, каждый из которых, наполняет модель уже своими конкретизированными объектами (уточнениями от абстрактных).
Стоит задача написать плагин, который не расширяет классы соответствующих конкретных объектов, а просто использует их чтобы получить новую информацию или по другому их отобразить.
| Цитата: |
Вы хотите построить довольно сложную систему с нуля. Почему бы не воспользоваться одной из реализаций OSGi - будет вам все как в эклипс? Еще посмотрите на Netbeans Platform - имхо попроще чем OSGi, но при этом полноценная модульная платформа.
|
Мне не понятен механизм взаимодействия который там заложен. Функциональность, заложенная в плагине, может быть только расширена или можно воспользоватся ею (как сервисом).
| Цитата: |
Я, конечно, могу ошибаться, но в моем понимании, если один какой-то плагин зависит от другого, то этот другой является для него как бы "основным приложением".
|
Да, если цель плагина - расширить другой, но нет если цель плагина - воспользоваться другим. |
|
| Вернуться к началу |
|
 |
evillive Постоянный посетитель
Зарегистрирован: 17.11.2008 Сообщения: 505
|
Добавлено: Мар 10, 2010 22:25 Заголовок сообщения: Re: RE: Java приложение с поддержкой плагинов |
|
|
| x8m6 писал(а): |
Как автоматически выявить все эти зависимости
|
В каждом модуле должна быть какая-то мета информация, где кроме всего прочего будут указаны зависимости данного модуля от других.
| x8m6 писал(а): |
К примеру в ядре есть абстрактная модель со списком абстрактных объектов . И есть несколько плагинов, каждый из которых, наполняет модель уже своими конкретизированными объектами (уточнениями от абстрактных).
Стоит задача написать плагин, который не расширяет классы соответствующих конкретных объектов, а просто использует их чтобы получить новую информацию или по другому их отобразить.
|
А в чем проблема? Чтобы плагин мог использовать модель, которую определяет ядро, ему вовсе не обязательно знать про все стальные плагины, которые "наполняют модель уже своими конкретизированными объектами" - ведь интерфейс уже определен ядром.
| x8m6 писал(а): |
Мне не понятен механизм взаимодействия который там заложен. Функциональность, заложенная в плагине, может быть только расширена или можно воспользоватся ею (как сервисом).
|
Так это одно и тоже.
Поясню: допустим модуль "Toolbar" объявил и реализовал сервис "addButton", с помощью которого любой другой модуль может добавить свою кнопку на панель инструментов. Этот сервис можно назвать точкой расширения модуля Toolbar, так как он предоставляет возможность как-то управлять внешним видом и функционалом модуля.
Другой модуль, например "MegaMath" объявил и реализовал сервис "calcSomeFunc", который можно использовать для каких-то расчетов. Это уже явно не точка расширения, но и то и то являются обычными сервисами. Так что разделение довольно условное. |
|
| Вернуться к началу |
|
 |
x8m6 Новичок
Зарегистрирован: 10.12.2008 Сообщения: 70
|
Добавлено: Мар 11, 2010 15:46 Заголовок сообщения: RE: Java приложение с поддержкой плагинов |
|
|
| Цитата: |
В каждом модуле должна быть какая-то мета информация, где кроме всего прочего будут указаны зависимости данного модуля от других.
|
Это понятно что должна быть, но как все же собирать SDK?
| Цитата: |
| А в чем проблема? Чтобы плагин мог использовать модель, которую определяет ядро, ему вовсе не обязательно знать про все стальные плагины, которые "наполняют модель уже своими конкретизированными объектами" - ведь интерфейс уже определен ядром. |
Модель то получить он сможет, но работать с конкретизированными объектами не сможет, не имея их спецификации (классы этих объектов, определенные в других плагинах). - здесь имеется ввиду на этапе написания кода и компиляции плагина, а не в рантайме.
Давайте все же определимся что же такое плагин, написанный на Java:
физически это Jar-архив, содержащий множество классов и интерфейсов(как тип данных языка Java) разнесенных по пакетам.
Все что является открытым (интерфейсы, паблик класы, паблик методы и поля) является интерфейсом плагина или сервисом, который этот плагин предоставляет. Сервис может быть расширяемым (т.е. точки расширения) - тогда мы пишем код на плагин и плагин этот код полиморфно обрабатывает (как небольшой фрэймворк). Сервис может просто использоватся - тогда мы просто исполняем код плагина (плагин в этом случае работает как библиотека). |
|
| Вернуться к началу |
|
 |
evillive Постоянный посетитель
Зарегистрирован: 17.11.2008 Сообщения: 505
|
Добавлено: Мар 11, 2010 18:15 Заголовок сообщения: Re: RE: Java приложение с поддержкой плагинов |
|
|
| x8m6 писал(а): |
Это понятно что должна быть, но как все же собирать SDK?
|
Вы же уже писали, что хотите чтобы в SDK попадал тот минимум, который необходим разработчику для реализации конкретной задачи. Теперь у вас есть дерево зависимостей модулей, значит вы можете этот минимум извлечь.
Вас смущает, что один модуль может потянуть за собой большое количество других? Ну, по другому - никак. Нужно лишь стараться уменьшать количество связей между модулями и избегать циклических зависимостей.
| Цитата: |
Модель то получить он сможет, но работать с конкретизированными объектами не сможет, не имея их спецификации (классы этих объектов, определенные в других плагинах). - здесь имеется ввиду на этапе написания кода и компиляции плагина, а не в рантайме.
|
В таком случае задумайтесь, зачем вообще в ядре определять какие-то интерфейсы, если работать нужно с какими-то конкретными классами? Тут либо неправильно определены интерфейсы, либо они в вообще не нужны в данном случае.
| Цитата: |
Давайте все же определимся что же такое плагин, написанный на Java:
физически это Jar-архив, содержащий множество классов и интерфейсов(как тип данных языка Java) разнесенных по пакетам.
Все что является открытым (интерфейсы, паблик класы, паблик методы и поля) является интерфейсом плагина или сервисом, который этот плагин предоставляет.
Сервис может быть расширяемым (т.е. точки расширения) - тогда мы пишем код на плагин и плагин этот код полиморфно обрабатывает (как небольшой фрэймворк). Сервис может просто использоватся - тогда мы просто исполняем код плагина (плагин в этом случае работает как библиотека). |
Можно небольшой пример? |
|
| Вернуться к началу |
|
 |
x8m6 Новичок
Зарегистрирован: 10.12.2008 Сообщения: 70
|
Добавлено: Мар 25, 2010 21:22 Заголовок сообщения: RE: Java приложение с поддержкой плагинов |
|
|
| Цитата: |
| Теперь у вас есть дерево зависимостей модулей, значит вы можете этот минимум извлечь. |
На самом деле мне нужно дерево зависимостей классов и информацию о их физическом размещении. Как такое дерево построить в рантайме?
| Цитата: |
В таком случае задумайтесь, зачем вообще в ядре определять какие-то интерфейсы, если работать нужно с какими-то конкретными классами? Тут либо неправильно определены интерфейсы, либо они в вообще не нужны в данном случае.
|
Например чтобы получить модель из ядра и воспользоваться её методами для наполнения объектами.
| Цитата: |
| Можно небольшой пример? |
Ну к примеру есть плагин Viewer в котором определен интерфейс IDrawable c методом draw(). Также есть несколько реализаций этого интерфейса. Каждому объекту модели подставляется своя реализация. Основной класс в этом плагине - это рендерер, который проходит по списку объектов и у каждого вызывает метод draw().
Теперь стоит задача написать плагин, расширяющий функциональность плагина Viewer. например случай когда ViewerExt содержит только новые реализации интерфейса IDrawable.
Т.е. Viewer является для ViewerExt расширяемым плагиным и берет визуализацию на себя (можно сказать как "небольшой фреймворк"). |
|
| Вернуться к началу |
|
 |
evillive Постоянный посетитель
Зарегистрирован: 17.11.2008 Сообщения: 505
|
Добавлено: Мар 26, 2010 20:41 Заголовок сообщения: Re: RE: Java приложение с поддержкой плагинов |
|
|
| x8m6 писал(а): |
На самом деле мне нужно дерево зависимостей классов и информацию о их физическом размещении. Как такое дерево построить в рантайме? |
Не знаю. Зачем это надо?
| Цитата: |
Например чтобы получить модель из ядра и воспользоваться её методами для наполнения объектами.
|
Вот как я бы сделал с использованием только стандартных средств (которые стали доступны в java SE 6)
Первый плагин - Model SPI. Только определяет сервис, сам ничего не реализует и не от чего не зависит. Состоит всего из 1 интерфейса - это ваша модель:
| Код: |
package core.spi;
/**
*
* @author evillive
*/
public interface Model {
public String getName();
} |
Второй плагин - Core Model Provider - это, допустим, стандартная реализация модели. Core Model Provider зависит от Model SPI т. к. должен реализовать интерфейс Model.
| Код: |
package core.model;
import core.spi.Model;
/**
*
* @author evillive
*/
public class CoreModelImpl implements Model {
public String getName() {
return "CoreModelImpl";
}
}
|
Чтобы зарегистрировать провайдер, нужно создать файл core.spi.Model в каталоге META-INF/services, который будет содержать список провайдеров, реализующих сервис core.spi.Model.
Т. е. в нашем случае файл META-INF/services/core.spi.Model содержит одну строку core.model.CoreModelImpl
Третий плагин - Custom Model Provider - допустим, что это плагин от стороннего разработчика. Он предоставляет свою реализацию модели. Как и Core Model Provider он зависит лишь от Model SPI.
| Код: |
package custom.model;
import core.spi.Model;
/**
*
* @author evillive
*/
public class CustomModelImpl implements Model {
public String getName() {
return "CustomModelImpl";
}
} |
И его файл META-INF/services/core.spi.Model будет содержать custom.model.CustomModelImpl соответственно.
И, на конец четвертый плагин - Model User - будет использовать эти конкретные реализации модели (CoreModelImpl и CustomModelImpl), но зависеть он будет только от Model SPI!. Таким образом для компиляции ему понадобится только Model_SPI.jar (который состоит всего из одного интерфейса).
| Код: |
package modeluser;
import core.spi.Model;
import java.util.ServiceLoader;
/**
*
* @author evillive
*/
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
ServiceLoader<Model> loader = ServiceLoader.load(Model.class);
for (Model model : loader) {
System.out.println(model.getName());
}
}
} |
Вывод:
| Код: |
run:
CoreModelImpl
CustomModelImpl
|
Что имеем:
- сторонние разработчики имеют возможность предоставлять свои реализации модели;
- могут использовать существующие с помощью ServiceLoader'а;
- для компиляции плагина, использующего модели, определенные в других плагинах, достаточно иметь Model_SPI.jar.
Почитать на тему (хотя я уже в этой теме давал похожую ссылку, но тут понятнее написано):
Creating Extensible Applications With the Java Platform
Исходники примера(4 проекта для NetBeans, возможно придется поправить пути до зависимостей)
| Цитата: |
Ну к примеру есть плагин Viewer в котором определен интерфейс IDrawable c методом draw(). Также есть несколько реализаций этого интерфейса. Каждому объекту модели подставляется своя реализация. Основной класс в этом плагине - это рендерер, который проходит по списку объектов и у каждого вызывает метод draw().
Теперь стоит задача написать плагин, расширяющий функциональность плагина Viewer. например случай когда ViewerExt содержит только новые реализации интерфейса IDrawable.
Т.е. Viewer является для ViewerExt расширяемым плагиным и берет визуализацию на себя (можно сказать как "небольшой фреймворк"). |
Аналогично примеру с моделью. Нужно разбить на 2 плагина: Viewer SPI, в котором будет объявлен интерфейс IDrawable (чтобы при реализации не пришлось тащить лишнего) и сам Viewer (он же рендерер по совместительству).
Теперь ViewerExt будет добавлять свои реализации IDrawable, при этом будет зависить только от легковесного Viewer SPI. |
|
| Вернуться к началу |
|
 |
x8m6 Новичок
Зарегистрирован: 10.12.2008 Сообщения: 70
|
Добавлено: Июл 16, 2010 15:23 Заголовок сообщения: RE: Java приложение с поддержкой плагинов |
|
|
Продолжим обсуждение. Service Api скорее всего то что нужно. А можно ли как то получить доступ к конкретной реализации сервиса, но не имея зависимости от ней? К примеру как то так:
| Код: |
package modeluser;
import core.spi.Model;
import java.util.ServiceLoader;
public static void main(String[] args) {
ServiceLoader<Model> loader = ServiceLoader.load(Model.class);
// здесь нужно получить доступ именно к CustomModelImpl
Model model = loader.get("CustomModelImpl");
// здесь должен быть вызван именно метод модели //CustomModelImpl
System.out.println(model.getName());
}
}
|
Нужно чтобы этот пользовательский плагин также зависел только Model_SPI.jar |
|
| Вернуться к началу |
|
 |
evillive Постоянный посетитель
Зарегистрирован: 17.11.2008 Сообщения: 505
|
Добавлено: Июл 16, 2010 16:10 Заголовок сообщения: Re: RE: Java приложение с поддержкой плагинов |
|
|
Вы можете получить список всех провайдеров, а из него уже можно выбрать конкретно тот, который вам нужен.
| Код: |
package modeluser;
import core.spi.Model;
import java.util.ServiceLoader;
public class Main {
public static void main(String[] args) {
ServiceLoader<Model> loader = ServiceLoader.load(Model.class);
Model customModel = null;
//Так мы можем найти нужную реализацию:
for (Model model : loader) {
if (model.getName().equals("CustomModelImpl")) {
customModel = model;
break;
}
}
if (customModel == null) {
System.out.println("CustomModelImpl not found");
return;
}
//Далее работаем уже с конкретной реализацией
...
}
}
|
|
|
| Вернуться к началу |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|