Pull to refresh

Eclipse RCP Cookbook Part I

Reading time 7 min
Views 13K
В данной статье я расскажу, что такое Eclipse Rich Client Platform, как она работает и с чем ее есть. Прошу обратить внимание, если вы ищите туториал, как создать свою RCP, то вам сюда, я же хочу рассказать как она работает изнутри.

Введение


Рассмотреть всю Eclipse RCP со своей многолетней историей в одном посте практически невозможно, поэтому для начала я хотел бы осветить основные концепции платформы, такие как рабочая область (workbench), плагины, зависимости между ними и среда выполнения.
В тексте я буду указывать ссылки на полезную литературу, в частности, на статьи
Ларса Вогеллы, он является признанным докладчиком в мире Eclipse технологий, и неоднократным обладателем наград сообщества Eclipse.

Eclipse


Eclipse — это расширяемая платформа для создания IDE. Платформа расширяется с помощью плагинов, каждый из которых может дополнять поведение Eclipse. Например, добавляя новые редакторы, пункты меню и т.д.

Рабочая область




Рабочая область (workbench) — это корневой элемент графического представления Eclipse платформы. Она может содержать одно или несколько окон (workbench window), которые предоставляют пользователю некоторую модель. Чаще всего это ресурсы, хранящиеся в рабочем пространстве (workspace). Открыть новое окно можно с помощью пункта Window → New Window.
Каждое окно содержит коллекцию страниц (workbench page) и ссылку на активную страницу, только одна страница может быть активна в одном окне.
Редакторы (editors) и виды (views) хранятся в странице с помощью соответствующих менеджеров (ViewFactory, EditorManager). У редакторов и видов есть общий интерфейс — IWorkbenchPart, далее рабочая часть. Рабочая область не хранит ссылки на редакторы и виды, а использует промежуточные объекты EditorReference и ViewReference. Это позволяет загружать плагины, используя отложенную инициализацию (lazy initialization). Например, на следующем скриншоте плагины, в которых определены виды Hierarchy, Javadoc и Declaration, могут быть ещё не загружены, поскольку пока не используются.



Виды и редакторы очень похожи друг на друга, они вместе являются частями страницы, имеют одинаковый механизм для создания меню и кнопок, те и другие могут отображать содержимое нескольких файлов, однако все же между ними есть концептуальные отличия. Несколько экземпляров редактора может быть создано на одной странице, в отличие от видов. Редакторы могут отображать состояние изменения файла (dirty), сообщая о том что есть несохраненные изменения, которые могут быть утеряны, если закрыть редактор без сохранения.

Страница также содержит в себе множество перспектив (perspective). Перспектива — это шаблон страницы, содержащий коллекцию частей, их взаимное расположение на странице, сочетания клавиш для команд, видимость меню и многое другое. Настроить перспективу можно с помощью команды Window → Customize Perspective.
Информация о пользовательских настройках хранится в директории [workspace]/.metadata/.plugins/org.eclipse.ui.workbench/. С помощью этих файлов вы можете использовать свои настройки перспектив в различных рабочих областях. Однако все же лучше использовать опцию копирования настроек при переключении рабочих областей.

Читаем про рабочую область здесь и более подробно здесь.

Плагин


Плагин — это компонент, который предоставляет определенный сервис внутри контекста рабочей области. Примером плагинов могут быть org.eclipse.debug.core, который позволяет разработчику отлаживать свои программы, и org.eclipse.debug.ui, содержащий графическую представление для первого.

Описание плагина происходит в специальном XML файле — plugin.xml, лежащего в папке плагина. Данный файл описывает каким образом плагин расширяет Eclipse платформу (описывает редакторы, виды, контекстные меню), каким образом он это делает будет описано в разделе «Зависимости». Код имплементации плагина будет загружен только тогда, когда плагин запустится, снова отложенная инициализация. Таким образом Eclipse может отображать расширения плагина без его непосредственной загрузки.

Пример plugin.xml представлен в статье «What is the plug-in manifest file (plugin.xml)?»

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
   <extension
         point="org.eclipse.ui.views">
      <view
            class="com.xyz.myplugin.ViewPart"
            id="com.xyz.myplugin.testview"
            name="Test View">
      </view>
   </extension>
</plugin>


Cреда выполнения


Среда выполнения Eclipse предоставляет функциональность отвечающую за контроль жизненного цикла плагина. Плагин будет загружен только тогда, когда это необходимо, и аналогично отключен. При этом внутри запущенной eclipse будет создан экземпляр (instance) плагина и точкой взаимодействия считается класс плагина (org.eclipse.core.runtime.Plugin), его же называют активатором. Основная функция активатора — произвести дополнительные действия во время старта плагина (инициализация изображений, кэширование определенных статических ресурсов и т.д.). Если нет необходимости производить дополнительные действия, то можно не указывать активатор и будет использован стандартный. Более подробно об активаторе читаем здесь. Среда выполнения Eclipse реализует спецификацию OSGi.

OSGi (Open Services Gateway Initiative) — это спецификация, позволяющая разделить сложную систему на модули (bundles) и удалённо устанавливать, обновлять или удалять эти модули без перезагрузки системы. У каждого модуля есть набор зависимостей на другие модули и строго определенное API для взаимодействия с другими модулями.
Технически, модуль — это .jar файл, который содержит дополнительную мета информацию, которая хранится в META-INF/MANIFEST.MF модуля, данный файл является частью спецификации jar файла. Среда выполнения отличная от OSGi будет игнорировать данные файлы.

Также в OSGi описаны такие компоненты, как bundle, service, life-cycle, services registry и так далее. OSGi архитектура выглядит следующим образом:

image

Кроме Eclipse, OSGi имеет еще несколько других имплементаций, таких как Apache Felix, Knopflerfish, Concierge OSGi и другие. Более подробно об OSGi читаем на официальном сайте, в вики и у Ларса.

Equinox


Имплементация OSGi в Eclipse носит философское название Equinox. Таким образом плагин является модулем OSGi, и его мета информация выглядит следующим образом.

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Test Plug-in
Bundle-SymbolicName: com.xyz.myplugin; singleton:=true
Bundle-Version: 1.0.0
Bundle-Activator: com.xyz.MyPlugin
Require-Bundle: org.eclipse.ui,
 org.eclipse.core.runtime
Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: JavaSE-1.6

Equinox отвечает за управление зависимостями между модулями во время выполнения. Он читает MANIFEST.MF модуля во время установки и убеждается что все зависимые модули уже загружены и затем активирует запрашиваемый модуль. Если зависимости не встречаются, модуль не загрузится. Если модуль пытается обратится к классу без зависимости на него, будет выброшен ClassNotFoundException.
OSGi доступны для активации плагины, которые находятся в отдельной папке плагинов eclipse_install_dir/plugins.

Зависимости


Прямая зависимость

Эту роль исполняют зависимый и требуемый плагины. Классическая прямая зависимость описывается в мета-дате плагина MANIFEST.MF.
Зависимость определяется не только во время выполнения, но и во время компилирования. Во время выполнения Eclipse убеждается, что все необходимые зависимости доступны для зависимого модуля и потом только активирует его. Во время компилирования Eclipse соответственно изменяет classpath зависимого плагина.

Расширение


Одна из самых распространенных и используемых зависимостей в Eclipse имеет название «точки расширения» (extension points). Точки используется для расширения (extension) функционала хоста множеством других плагинов без прямой зависимости на него. Расширения и точки расширения описывается в файле описания плагина plugin.xml.
Плагин, определяющий точку расширения позволяет другим плагинам добавить функциональность, основываясь на описании расширения. Расширение может быть как кодом, так и данными.

Хорошим примером точек расширения является сеть электропитания: в ней точкой расширения является розетка, в которую могут подключаться другие элементы электросети (лампы, компьютеры, утюги), которые расширяют функционал электросети. При этом каждое устройство должно иметь устройство согласование с сетью электропитания, иначе подключиться оно не сможет.

Продолжая примеры, в модуле org.eclipse.ui описано множество точек расширения, таких как «редакторы», «виды», «меню». При этом есть другой плагин org.eclipse.help.ui, который добавляет свой пункт меню «Help->Help Contents». Для этого в нем описано следующее расширение

<extension point="org.eclipse.ui.actionSets">
   <actionSet description="%actionSet.description" id="org.eclipse.help.ui.actions" label="%actionSet.label" visible="true"> 
      <action class="org.eclipse.help.ui.internal.DynamicHelpAction" icon="$nl$/icons/etool16/help.gif" id="org.eclipse.help.ui.dynamicHelp" label="%searchAction.label" style="push" toolbarPath="org.eclipse.ui.workbench.navigate" tooltip="%dynamicHelpAction.tooltip"/>
   </actionSet>
</extension>



Если остались какие-то непонятные моменты с точками расширения, то советую разобраться, так как механизм является основным для взаимодействия плагинов.
Так что читаем здесь, здесь и более подробно с примерами здесь. Список точек расширения платформы представлен здесь.

Плагины, кроме того, что могут использовать уже существующие точки расширения, могут определять новые. Точки описываются с помощью *.exsd и соответствующим тегом extension-point со ссылкой на файл описания.

<extension-point id="com.xyz.myplugin.ext" 
   name="Test Extension Point" schema="schema/myextpoint.exsd"/>

В этом файле будет описан интерфейс взаимодействия расширений с хостом, а именно требуемые данные и/или классы, реализующие определенные интерфейсы.
Читаем более подробно о создании собственных точек расширений снова у Ларса и здесь.

Полезные ссылки


General Eclipse Programming

Eclipse 4 RCP — Tutorial от Lars Vogel
Eclipse Rich Client Platform (2nd Edition)
Top 10 mistakes in Eclipse Plug-in Development

Eclipse Platform

How to Use the Eclipse API
Notes on the Eclipse Plug-in Architecture

Eclipse UI
Inside the Workbench
Eclipse User Interface Guidelines

Что потом?


Если публика захочет узнать дальше об Eclipse, как о платформе для разработки приложений, то я мог бы продолжить написание статей и пролить свет на следующие технологии

  • Eclipse resources
  • Eclipse modeling (EMF/databinding)
  • Eclipse UI (SWT/jface/GEF/GMF/graphiti)
  • Eclipse RCP deployment (maven/tycho)

Однако, в первую очередь, хотелось бы узнать, что интересно Вам, возможно, углубится в теорию — инструменты разработки, их концепции, особенности, или же провести серию туториалов, в которой создадим Eclipse плагин, и параллельно рассмотрим теоретические аспекты разработки (идеи, какого плагина Вам не хватает в Eclipse, только приветствуются).
Tags:
Hubs:
+8
Comments 2
Comments Comments 2

Articles