RSS 2.0 Версия для КПК (Бета)
Конференция JavaTalks  :  Java форум
JavaTalks - форум программистов
Java форум JavaTalks
форум программистов 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Java приложение с поддержкой плагинов
На страницу Пред.  1, 2
 
Начать новую тему   Ответить на тему    Список форумов Java форум JavaTalks -> Отражение (Reflection API)
Предыдущая тема :: Следующая тема  
Автор Сообщение
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;
        }
        
        //Далее работаем уже с конкретной реализацией
        ...
     }
}
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов Java форум JavaTalks -> Отражение (Reflection API) Часовой пояс: GMT + 3
На страницу Пред.  1, 2
Страница 2 из 2

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


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

GetJava Download Button Rambler's Top100
Хостинг от bizname.ru
При поддержке hitech.com.ua