T.M. SoftStudio

feci quod potui, faciant meliora potentes

Купить полную версию книги "Среда разработки Eclipse 4: Руководство разработчика"

  • Разработка Eclipse-плагинов

    Мастер Plug-in Project

    Создание OSGi-модуля

    Точкой ветвления мастера Plug-in Project на создание проекта Eclipse-плагина или OSGi-модуля является выбор переключателя Eclipse version: или переключателя an OSGi framework: в окне мастера.

    При выборе переключателя OSGi framework: можно также сделать выбор между соответствием файла MANIFEST.MF создаваемого OSGi-модуля Equinox-реализации OSGi или его соответствием базовой OSGi-спецификации.

    После выбора переключателя OSGi framework: и нажатия кнопки Next мастера Plug-in Project, появляется страница Content, предлагающая те же опции, что и в случае выбора переключателя Eclipse version:. Отличие состоит в том, что при создании OSGi-модуля недоступен флажок This plug-in will make contributions to the UI и, в случае выбора флажка Generate an activator, a Java class that controls the plug-ins life cycle, соответственно генерируется Activator-класс, реализующий интерфейс org.osgi.framework.BundleActivator, который обеспечивает методы жизненного цикла OSGi-модуля. Кроме того отсутствует переключатель Rich Client Application создания RCP-приложений.

    После нажатия кнопки Next страницы Content мастера Plug-in Project, открывается страница Templates с набором шаблонов создания основы проекта OSGi-модуля.

    Шаблон Dictionary OSGi Service создает основу OSGi-сервиса, предоставляющего сервис словаря. В результате выбора данного шаблона будет создан проект, содержащий в папке src Java-пакет с классами и интерфейсами Activator, Dictionary, DictionaryImpl, DictionaryService, DictionaryServiceImpl.

    Интерфейс Dictionary объявляет два метода, один из которых возвращает язык словаря, а другой проверяет наличие слова в словаре.

    Класс DictionaryImpl представляет реализацию интерфейса Dictionary, в которой определяется сам словарь в виде списка слов и его язык.

    Интерфейс DictionaryService объявляет методы регистрации словаря, его удаления и проверки наличия слова в словаре.

    Класс DictionaryServiceImpl представляет реализацию интерфейса DictionaryService, в которой определяется список Dictionary-объектов, а регистрация и удаление словаря заключаются в добавлении и удалении Dictionary-объекта из списка. В методе проверки наличия слова в словаре применяется метод проверки для всех Dictionary-объектов списка.

  • В методе start() класса Activator с помощью метода registerService() интерфейса org.osgi.framework.BundleContext сервис DictionaryService регистрируется в реестре сервисов OSGi-контейнера. Также создается объект org.osgi.util.tracker.ServiceTracker, упрощающий работу с реестром сервисов. С помощью метода addServiceListener() интерфейса BundleContext Activator-класс регистрируется в качестве слушателя событий регистрации и удаления сервиса DictionaryService из реестра сервисов, а также событий модификации свойств сервиса. Для обработки данных событий Activator-класс реализует интерфейс org.osgi.framework.ServiceListener с определением его метода serviceChanged(), в котором методом getServiceReference() объекта событий org.osgi.framework.ServiceEvent получается объект org.osgi.framework.ServiceReference ссылки на сервис. На основе объекта ServiceReference при регистрации в реестре в сервисе DictionaryService регистрируется реализация интерфейса Dictionary. В методе start() класса Activator зарегистрированный сервис получается методом getService() объекта ServiceTracker с дальнейшей регистрацией в нем реализации интерфейса Dictionary.

    После запуска OSGi-модуля, предоставляющего сервис, воспользоваться сервисом могут другие OSGi-модули или Eclipse-плагины, получив ссылку ServiceReference на сервис из реестра сервисов, используя метод getServiceReference() объекта BundleContext, с последующим получением объекта сервиса с помощью метода getService() объекта BundleContext на основе ServiceReference-ссылки.

    Шаблон Hello OSGi Bundle создает простой OSGi-модуль, содержащий Activator-класс, который в методе start() и методе stop() выводит строку в консоль.

    Шаблон OSGi Declarative Service Example создает основу декларативного OSGi-сервиса, предоставляющего сервис словаря.

    Технология декларативных OSGi-сервисов (Declarative Services (DS)) позволяет определять и потреблять сервисы, используя XML-метаданные. При этом в файл MANIFEST.MF OSGi-модуля добавляется заголовок Service-Component:, указывающий XML-файл папки OSGI-INF/, который определяет компонент OSGi Service Component. Компонент Service Component отвечает за запуск декларативного сервиса. Среда выполнения OSGi считывает файл MANIFEST.MF, затем находит XML-описание компонента Service Component и создает соответствующий сервис.

  • В результате выбора шаблона OSGi Declarative Service Example будет создан проект, содержащий в папке src Java-пакет с классами и интерфейсами сервиса словаря, а в папке OSGI-INF/ файл dictionary.xml компонента Service Component, определяющий реализацию сервиса DictionaryImpl с указанием интерфейса сервиса Dictionary, тем самым обеспечивая регистрацию сервиса Dictionary в реестре сервисов.

    Кроме того, в папке src будет создан сервисный класс ServiceComponent, реализующий интерфейс org.eclipse.osgi.framework.console.CommandProvide и обеспечивающий дополнительные команды для OSGi-консоли. В данном случае устанавливаются две консольные команды check и languages, при наборе которых будет вызваны методы check() и getLanguages() сервиса DictionaryService. Для регистрации сервиса ServiceComponent в реестре сервисов также используется XML-файл component.xml компонента Service Component, определяющий реализацию интерфейса CommandProvider, а также связывание с сервисом DictionaryService. Таким образом, сервис ServiceComponent представляет собой одновременно пример декларативного сервиса и пример декларативного потребителя сервиса DictionaryService.

    Для создания декларативных OSGi-сервисов PDE-плагин предлагает мастер Component Definition команды New | Other создания XML-файла описания компонента Service Component. Поле File name: мастера предлагает ввести имя нового XML-файла, поле Name: - имя компонента, а поле Class: - имя класса реализации сервиса. При этом ссылка Class: обеспечивает открытие мастера создания нового Java-класса. После нажатия кнопки Finish мастера создается новый XML-файл компонента и при желании новый класс реализации декларативного сервиса. Созданный XML-файл компонента автоматически указывается в заголовке Service-Component: файла MANIFEST.MF OSGi-модуля.

    XML-файл компонента открывается в PDE-редакторе с тремя вкладками Overview, Services и Source. Вкладка Overview обеспечивает визуальное редактирование свойств компонента. Вкладка Services позволяет указать потребляемые сервисы и предоставляемые сервисы. Кнопка Edit вкладки Services дает возможность отредактировать и дополнить атрибуты тэгов <reference> и <provide> XML-файла компонента. Вкладка Source отображает содержимое XML-файла компонента.

    Шаблон OSGi EventAdmin Service Example создает OSGi-модуль, содержащий сервис, который представляет собой слушателя событий системы опубликования-подписки событий, обеспечиваемой сервисом org.osgi.service.event.EventAdmin OSGi-контейнера. Класс слушателя событий EventAdmin-системы сообщений должен реализовывать интерфейс org.osgi.service.event.EventHandler с определением его метода handleEvent(Event event), который автоматически вызывается EventAdmin-сервисом среды выполнения. Объект слушателя событий должен быть зарегистрирован в реестре сервисов OSGi-контейнера с сервисным свойством org.osgi.service.event.EventConstants.EVENT_TOPIC, определяющим темы событий, на которые подписывается слушатель событий. Публикующий события OSGi-модуль должен получить из реестра сервисов объект EventAdmin, создать объект события с определенной темой и опубликовать его с помощью метода postEvent(Event event) или метода sendEvent(Event event) EventAdmin-объекта.

  • В результате выбора шаблона OSGi EventAdmin Service Example будет создан проект, содержащий в папке OSGI-INF/ файл component.xml компонента Service Component, обеспечивающий регистрацию в реестре сервисов класса ServiceComponent папки src проекта со свойством event.topics. Класс ServiceComponent реализует интерфейс org.osgi.service.event.EventHandler с определением его метода handleEvent(Event event), в котором производится обработка событий с определенной темой – в данном случае событий запуска OSGi-модуля. Файл манифеста MANIFEST.MF проекта содержит заголовок Service-Component:, указывающий файл component.xml папки OSGI-INF/.

    Шаблон OSGi Simple LogService Example создает OSGi-модуль, регистрирующий в реестре сервисов простой сервис вывода сообщений.

    Шаблон Preferences OSGi Service Example создает OSGi-модуль, Activator-класс которого в методе start() извлекает из реестра сервисов объект org.osgi.service.prefs.PreferencesService, представляющий собой системный сервис хранения настроек OSGi-модуля. Затем извлекает с помощью объекта PreferencesService объект org.osgi.service.prefs.Preferences своих настроек и заносит в него новую пару ключ-значение.

    После выбора шаблона окна Templates и нажатия кнопки Next можно определить дополнительные настройки выбранного шаблона. После нажатия кнопки Finish будет сгенерирована основа проекта OSGi-модуля.

    После появления проекта OSGi-модуля в Workspace-пространстве среды Eclipse, разрабатываемый OSGi-модуль появится в списке окна Plug-ins и будет иметь зависимость от плагина org.eclipse.osgi.

    Контекстное меню окна Package Explorer своей командой Run As | OSGi Framework позволяет запустить разрабатываемый OSGi-модуль в OSGi-контейнере целевой платформы Eclipse.

    Команда Debug As | OSGi Framework контекстного меню окна Package Explorer обеспечивает отладку OSGi-модуля с его запуском в OSGi-контейнере целевой платформы Eclipse.

    Для исключения из целевой платформы Eclipse неиспользуемых плагинов необходимо скопировать плагин org.eclipse.osgi_ххх.jar в отдельный каталог и в разделе Plug-in Development | Target Platform команды Preferences меню Window создать новую целевую платформу, используя кнопку Add и переключатель Nothing. Во вкладке Location кнопкой Add нужно добавить каталог с плагином org.eclipse.osgi_ххх.jar. После завершения создания новой целевой платформы необходимо отметить ее флажок в разделе Plug-in Development | Target Platform команды Preferences. Теперь запуск OSGi-модуля будет осуществляться исключительно в среде выполнения OSGi.

    Мастер Deployable plug-ins and fragments команды Export контекстного меню окна Package Explorer обеспечивает экспорт проекта OSGi-модуля в готовый для развертывания JAR-файл.

  • После выбора мастера Deployable plug-ins and fragments раздела Plug-in Development команды Export контекстного меню окна Package Explorer для проекта OSGi-модуля и нажатия кнопки Next, вкладка Destination окна Export своими переключателями Directory, Archive File и Install into host.Repository: позволяет выбрать экспорт OSGi-модуля в указанный каталог в виде JAR-файла, в указанный каталог в виде ZIP-архива и в каталог среды Eclipse Standard, содержащий инсталлированные плагины, так что после перезапуска среда Eclipse будет работать уже с созданным OSGi-модулем. При выборе переключателя Install into host.Repository: и перезапуске среды Eclipse удалить инсталлированный OSGi-модуль можно с помощью выбора команды About Eclipse меню Help, нажатия кнопки Installation Details, выбора OSGi-модуля и нажатия кнопки Uninstall.

    Развернуть готовый OSGi-модуль можно также поместив JAR-файл модуля в папку plugins каталога среды Eclipse с ее перезапуском. При этом деинсталляция OSGi-модуля производится удалением JAR-файла модуля из папки plugins каталога среды Eclipse с ее перезапуском. Запустить OSGi-модуль можно и в отдельном OSGi-контейнере org.eclipse.osgi с помощью cmd-команды:

    java -jar org.eclipse.osgi.jar –console

    и команд OSGi-консоли install и start.

    При двойном щелчке кнопкой мышки в окне Package Explorer на узлах файлов MANIFEST.MF и build.properties проекта OSGi-модуля открывается многостраничный редактор PDE-плагина, обеспечивающий визуальное редактирование свойств разрабатываемого OSGi-модуля. При этом PDE-редактор имеет ту же функциональность, что и в случае разработки Eclipse-плагина, за исключением отсутствия вкладок Extensions и Extension Points.


Мастер Fragment Project