Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Разработка плагина IntelliJ IDEA. Часть 1

Anna | 5.06.2014 | нет комментариев

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

Для разработки плагинов подойдет любая современная версия Intellij IDEA – она теснее включает в себя полный комплект нужного инструментария.
Для настройки среды разработки следует исполнить несколько шагов:

  • скачать начальные коды соответствующей версии Intellij IDEA Community Edition;
  • сделать SDK типа «Intellij Platform Plugin SDK» (на рисунке ниже) и указать путь до установленной Community Edition (дозволено применять Ultimate Edition, но отладка функций внутреннего API работает только в CE);
  • в настройках SDK, на странице Sourcepath нужно указать путь до загруженных на п.1 начальных кодов;
  • сделать новейший модуль с типом «Platform Plugin» и присвоить ему ранее сделанный SDK.

Позже чего дозволено приступать к разработке плагина как обыкновенного Java-плана, но с дополнительной вероятностью видеть начальный код внутреннего API и трассировать его исполнение в отладчике.

Номера сборок

Это ограничения на диапазон поддерживаемых версий, используемые интегрированной средой для определения вероятности правильной работы определенного плагина. Исходный и финальный номера билдов указываются в файле plugin.xml, как и прочая метаинформация.
Начиная с IntelliJ IDEA 9 применяется составная нумерация билда: скажем, IU-90.94. Данный номер состоит из следующих частей:

  • идентификатор продукта (IC для IDEA Community, IU для IDEA Ultimate, RM для RubyMine и PY для PyCharm);
  • номер ветви;
  • номер билда в этой ветке.

Всякий раз, когда создается очередная релизная ветвь одного из продуктов, основанных на платформе IntelliJ, номер ветки возрастает на 1, а номер в транке на 2, таким образом, нестабильные билды имеют четный номер, а стабильные – нечетный.

Комбинированные номера билдов могут использоваться в тегах since-build и until-build в файле plugin.xml. Обыкновенно идентификатор продукта спускают, применяя лишь номер ветки и билда: <idea-version since-build="94.539"/>

Совместимость плагинов с продуктами на платформе IntelliJ

Все продукты, основывающиеся на IntelliJ Platform (IntelliJ IDEA, RubyMine, WebStorm, PhpStorm, PyCharm и AppCode) разделяют всеобщий нижележащий API платформы. Таким образом, плагины, не использующие какую-либо специфичную Java функциональность могут быть помечены как совместимые с другими продуктами, а не только с самой IDEA. Сделать это дозволено определив зависимости от модулей в файле plugin.xml.
Зависимости помещаются внутри тега <depends>, содержимое тега начинается с com.intellij.modules. Скажем:

<idea-plugin version="2">
  ...
  <depends>com.intellij.modules.lang</depends>
  ...
</idea-plugin>

Если плагин не включает теги с зависимостями в plugin.xml, то он считается устаревшим и горазд запуститься только в IDEA. Если plugin.xml содержит по крайней мере один такой тег, то он загрузится если в продукте содержатся все модули на которые он ссылается.
На данный момент следующие модули доступны во всех продуктах семейства IntelliJ:

  • com.intellij.modules.platform;
  • com.intellij.modules.lang;
  • com.intellij.modules.vcs;
  • com.intellij.modules.xml;
  • com.intellij.modules.xdebugger.

А эти модули доступны только в соответствующих продуктах:

  • com.intellij.modules.java – IntelliJ IDEA;
  • com.intellij.modules.ruby – RubyMine;
  • com.intellij.modules.python – PyCharm;
  • com.intellij.modules.objc – AppCode.

PhpStorm не владеет специфичным модулем, но включает в себя PHP плагин, тот, что тоже допустимо применять как связанность: com.jetbrains.php.
Такжедопустимо применять необязательные зависимости. Если плагин работает со всеми продуктами, но предоставляет некоторую специфичную Java функциональность, то дозволено применять дальнейший тег:

<depends optional="true" 
         config-file="my-java-features.xml">com.intellij.modules.java</depends>

Перед определением плагина совместимым с остальными продуктами, стоит удостовериться, что не применяются никакие функции специфичные для API IntelliJ IDEA. Для того Дабы сделать это, нужно сделать SDK указывающей на установленный RubyMine либо PyCharm, скомпилировать плагин с этим SDK и проверить его работоспособность.

Конструкция плагина IntelliJ IDEA

Плагины – это исключительный поддерживаемый путь растяжения функциональности IDEA. Плагин использует предоставляемый программный интерфейс среды либо других плагинов для реализации собственной функциональных вероятностей. Обратим внимание на конструкцию и жизненный цикл плагина.

Содержимое плагинов

Существуют три метода организации содержимого плагина.
1-й – плагин содержит один jar-файл, помещенный в папке plugins. В архиве должен находиться конфигурационный файл (META-INF/plugin.xml) и классы, которые реализуют функциональность плагина. Конфигурационный файл определяет имя плагина, изложение, данные о разработчике, поддерживаемая версия IDE, компоненты, действия, группы действий.

.IntelliJIDEAx0
    plugins
        sample.jar/
            com/foo/.....
                ...
                ...
            META-INF
                plugin.xml

2-й метод – файлы плагина помещены в папке:

.IntelliJIDEAx0
    plugins
        Sample
            lib
                libfoo.jar
                libbar.jar
            classes
                com/foo/.....
                ...
                ...
            META-INF
                plugin.xml

Classes и lib механически добавляются в classpath.
3-й метод – файлы плагина помещаются в jar-файл, находящийся в папке lib:

.IntelliJIDEAx0
    plugins
        Sample
            lib
                libfoo.jar
                libbar.jar
                Sample.jar/
                    com/foo/.....
                    ...
                    ...
                    META-INF
                        plugin.xml
Загрузчики классов

Дабы загрузить классы всякого плагина, IDEA использует раздельные загрузчики классов. Это разрешает применять разные версии библиотеки, даже если она применяются самой IDEA либо иным плагином.
По-умолчанию, стержневой загрузчик классов загружает только те классы, которые не были обнаружены загрузчиком плагина. Тем не менее, в plugin.xml, в сегменты depends дозволено определить зависимости от других плагинов. В таком случае, загрузчики классов этих плагинов будут использованы для разрешения не обнаруженных классов в нынешнем плагине. Это разрешает ссылаться на классы из других плагинов.

Компоненты плагинов

Компоненты – это капитальный концепт интеграции плагинов. Существуют три вида компонентов:

  1. яруса приложения;
  2. яруса плана;
  3. яруса модуля.

Компоненты яруса приложения создаются и инициализируются во время старта IntelliJ IDEA.
Они могут быть получены от экземпляра класса Application с поддержкой способа getComponent(Class).

Компоненты яруса плана создаются для всякого экземпляра класса Project (они могут быть сделаны даже для неоткрытого плана). Их дозволено получить от экземпляра Project вызовом способа getComponent(Class).

Компоненты яруса модуля создаются для всякого модуля в всяком плане, загруженном в IDEA. Они могут быть получены аналогичным способом от экземпляра Module.

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

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

Растяжения плагинов и точки растяжения

Intellij IDEA предоставляет концепт растяжений и точек растяжения, которые разрешают взаимодействовать с другими плагинами и ядром IDEA.
Если требуется, Дабы плагин разрешал расширять его функциональность, то нужно определить одну либо несколько точек растяжения. Всякая такая точка определяет класс либо интерфейс, тот, что определяет протокол доступа к ней. Это же касается и растяжений плагина.

Определить растяжения и точки растяжения дозволено в конфигурационном файле в секциях <extensions> и<extensionPoints> соответственно.
Дабы зарегистрировать точку растяжения необходимо добавить дочерний элемент <extensionPoint> внутри сегменты <extensionPoints>, тот, что содержит наименование точки, класс либо интерфейс, расширяющий функциональность плагина. Для примера разглядим фрагмент файла plugin.xml:

<extensionPoints>
     <extensionPoint name="MyExtensionPoint1" beanClass="MyPlugin.MyBeanClass1">
     <extensionPoint name="MyExtensionPoint2 interface="MyPlugin.MyInterface">
  </extensionPoints>

Признак «interface» устанавливает интерфейс, тот, что должен быть реализован для растяжения функциональности. Признак «beanClass» определяет класс, содержащий одно либо несколько свойств помеченных аннотацией @Attribute. Плагин, предоставляющий точку растяжения прочитает эти свойства из файла plugin.xml.
Разглядим пример с MyBeanClass1:

public class MyBeanClass1 extends AbstractExtensionPointBean {
  @Attribute("key") public String key;
  @Attribute("implementationClass") public String implementationClass;

  public String getKey() {
    return key;
  }

  public String getClass() {
    return implementationClass;
  }
}

Дабы объявить растяжение с доступом к точке растяжения MyExtPoint, конфигурационный файл должен содержать тег <MyExtPoint> с признаками «key» и «implementationClass» с соответствующими значениями.

Для регистрации растяжения требуется исполнить следующие шаги:

  1. в элементе <extensions> установить значение признака «xmlns» (устарел) либо «defaultExtensionNs» одним из следующих:
    • «com.intellij», если плагин расширяет функциональность ядра IDEA;
    • <идентификатор плагина>, если плагин расширяет функциональность иного плагина.
  2. добавить новейший дочерний элемент в секцию <extensions>, наименование тега должно совпадать с идентификатором точки растяжения;
  3. определить тип точки растяжения, предпочтя из следующих:
    • если точка растяжения объявлена с признаком «interface», то в дочернем элементе нужно указать признак «implementation», значение которого – класс, реализующий данный интерфейс;
    • если точка растяжения объявлена с признаком «beanClass», то дочерний элемент должен содержать все признаки, которые были помечены в этом классе аннотацией @Attribute.

 

Действия (Actions)

Также Intellij IDEA предоставляет концепт действий (actions).
Действие – это класс, наследуемый от AnAction, чей способ actionPerformed() вызывается, когда выбран элемент меню либо кнопка тулбара.

Действия объединяются в группы, которые также могут содержать вложенные группы. Группы действий могут быть отображены как меню либо тулбары. Подгруппы отображаются как подменю.
Позднее действия будут рассмотрены больше детально.

Сервисы

Сервис – это компонент, загружаемый по требованию, когда плагин вызывает способ getService() класса ServiceManager. Intellij IDEA гарантирует, что будет сделан только один экземпляр обслуживания, самостоятельно от того сколько раз был вызван способ.

Сервисы обязаны иметь интерфейс, определенный в plugin.xml. Класс с реализацией будет использован при создании обслуживания.

Сервисы подразделяются по ярусам аналогично компонентам, т.е. на сервисы яруса приложения, плана и модуля, которым соответствуют точки растяжения applicationService, projectService и moduleService соответственно.

Дабы объявить сервис нужно:

  • добавить соответствующий дочерний элемент (<applicationService>, <projectService>, <moduleService>) в секцию <extensions>;
  • для добавленного элемента установить следующие признаки:
    • «serviceInterface» – интерфейс обслуживания;
    • «serviceImplementaion» – реализация обслуживания.

Классы интерфейса и реализации могут совпадать.
Пример из файла plugin.xml:

<extensions defaultExtensionNs="com.intellij">
    <!-- сервис яруса приложения -->
      <applicationService serviceInterface="Mypackage.MyServiceInterfaceClass" serviceImplementation="Mypackage.MyServiceImplClass">         
      </applicationService>

    <!-- сервис яруса плана -->
      <projectService serviceInterface="Mypackage.MyProjectServiceImplClass" serviceImplementation="Mypackage.MyProjectServiceImplClass">         
      </projectService>
 </extensions>

В дальнейшей части: конфигурационный файл, действия, планы и др.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB