| // |
| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you under the Apache License, Version 2.0 (the |
| // "License"); you may not use this file except in compliance |
| // with the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, |
| // software distributed under the License is distributed on an |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| // KIND, either express or implied. See the License for the |
| // specific language governing permissions and limitations |
| // under the License. |
| // |
| |
| = Работа с наборами модулей на платформе NetBeans с помощью Maven |
| :jbake-type: platform_tutorial |
| :jbake-tags: tutorials |
| :jbake-status: published |
| :syntax: true |
| :source-highlighter: pygments |
| :toc: left |
| :toc-title: |
| :icons: font |
| :experimental: |
| :description: Работа с наборами модулей на платформе NetBeans с помощью Maven - Apache NetBeans |
| :keywords: Apache NetBeans Platform, Platform Tutorials, Работа с наборами модулей на платформе NetBeans с помощью Maven |
| |
| В этом документе описываются принципы создания набора модулей на платформе NetBeans из архетипов Maven, принципы построения и установки этого набора в среде IDE. В этом учебном курсе будет создан проект набора модулей Maven, содержащий три модуля на платформе NetBeans в качестве подпроектов. Проект Maven с подпроектами является простым проектом POM, объявляющим метод компиляции набора модулей и цель установки. |
| |
| Этот документ основан на link:https://netbeans.apache.org/tutorials/nbm-selection-1.html[Учебном курсе по управлению выбором NetBeans] на базе Ant и описывает различия между Ant и Maven при разработке наборов модулей на платформе NetBeans. После изучения отличий Maven от Ant можно легко пройти другие учебные курсы в link:https://netbeans.apache.org/kb/docs/platform_ru.html[Учебной карте по платформе NetBeans]. |
| |
| При отсутствии опыта работы с платформой NetBeans можно посмотреть серию демонстрационных роликов link:https://netbeans.apache.org/tutorials/nbm-10-top-apis.html[10 лучших интерфейсов API NetBeans]. |
| |
| *Содержимое* |
| |
| |
| |
| * <<config,Использование Maven в среде IDE>> |
| * <<config1,Настройка параметров Maven>> |
| * <<config2,Просмотр репозиториев Maven>> |
| * <<01,Создание набора модулей на платформе NetBeans>> |
| * <<02,Изменение модуля MyAPI>> |
| * <<02a,Создание класса>> |
| * <<02b,Определение общедоступных пакетов>> |
| * <<03,Создание модуля MyViewer>> |
| * <<03b,Создание оконного компонента>> |
| * <<04,Создание модуля MyEditor>> |
| * <<04b,Добавление действия>> |
| * <<04c,Добавление компонента редактора>> |
| * <<05,Сборка и запуск набора модулей>> |
| * <<05a,Объявление прямых зависимостей>> |
| * <<05b,Определение местоположения установки NetBeans>> |
| * <<05c,Запуск приложения>> |
| * <<06,Динамическое изменение Lookup>> |
| |
| *Для работы с этим учебным курсом требуется программное обеспечение и ресурсы, перечисленные в следующей таблице.* |
| |
| |
| NOTE: Для разработки приложений на платформе NetBeans не требуется загружать отдельную версию этой платформы. Как правило, разработка приложений и модулей осуществляется в среде IDE NetBeans, затем необходимо просто включить требуемые модули для выполнения платформы NetBeans и созданного приложения. |
| |
| Перед изучением этого учебного курса можно ознакомиться со следующей документацией: |
| |
| * link:https://netbeans.apache.org/wiki/[Часто задаваемые вопросы по разработке NetBeans ] |
| * link:http://wiki.netbeans.org/MavenBestPractices[Практические рекомендации по Apache Maven в NetBeans 6.x]; |
| * link:http://www.sonatype.com/books/maven-book/reference/introduction.html[Глава 1. Введение в Apache Maven] (из книги link:http://www.sonatype.com/books/maven-book/reference/public-book.html[Maven: полное руководство]) |
| * link:https://netbeans.apache.org/kb/docs/java/gui-functionality_ru.html[Введение в разработку графического интерфейса ] |
| |
| |
| == Использование Maven в среде IDE |
| |
| Если это первый опыт работы с Maven, следует проверить параметры настройки и обозреватель репозиториев Maven. |
| |
| |
| === Настройка параметров Maven |
| |
| Для настройки поведения Maven в среде IDE и проверки корректности этой настройки перейдите на вкладку Maven в окне "Параметры". |
| |
| |
| [start=1] |
| 1. Выберите категорию "Разное" в окне "Параметры" и перейдите на вкладку Maven. |
| |
| [start=2] |
| 1. Укажите папку установки Maven (требуется версия 2.0.9 или более поздняя). |
| |
| [start=3] |
| 1. Подтвердите корректность адреса к локальному репозиторию Maven. |
| |
| [start=4] |
| 1. Нажмите кнопку "ОК". |
| |
| В большинстве случаев при использовании типичной настройки Maven данные в окне "Параметры" уже корректны. |
| |
| NOTE: Поддержка Maven активируется как часть набора функциональных возможностей Java SE. Если в окне "Параметры" вкладка Maven недоступна, подтвердите активацию Java SE при создании приложения Java. |
| |
| |
| === Просмотр репозиториев Maven |
| |
| Артефакты, используемые Maven для создания всех проектов, сохраняются в локальном репозитории Maven. Если артефакт объявлен как зависимость проекта и еще не установлен, он загружается в локальный репозиторий из одного из зарегистрированных удаленных репозиториев. |
| |
| Репозиторий NetBeans и некоторые известные индексированные репозитории Maven зарегистрированы и включены в список окна "Обозреватель репозитория" по умолчанию. Репозиторий NetBeans содержит большинство общедоступных артефактов, требуемых для создания проекта. Обозреватель репозиториев Maven можно использовать для просмотра содержимого локальных и удаленных репозиториев. Для просмотра локальных артефактов разверните узел "Локальный репозиторий". Артефакты, указанные в узлах удаленного репозитория, могут быть добавлены в качестве зависимостей проекта, однако не все из них представлены локально. Они добавляются к локальному репозиторию только в том случае, если объявляются в качестве зависимостей проекта. |
| |
| Чтобы открыть обозреватель репозиториев Maven: |
| |
| * выберите в главном меню "Окно" > "Прочее" > "Обозреватель репозиториев Maven". |
| |
| image::images/maven-quickstart68_maven-nbm-netbeans-repo.png[title="Снимок экрана: обозреватель репозиториев Maven"] |
| |
| |
| == Создание набора модулей на платформе NetBeans |
| |
| В этом разделе для построения набора модулей на платформе NetBeans из архетипа Maven используется мастер создания проекта. Мастер создает проект POM, содержащий проекты модулей. Также в мастере создается модуль в качестве подпроекта набора. |
| |
| |
| [start=1] |
| 1. Откройте мастер создания проекта и выберите в категории Maven "Набор модулей Maven NetBeans". Нажмите кнопку "Далее". |
| |
| [start=2] |
| 1. В поле "Имя проекта" введите *MavenSelectionSuite*. Нажмите кнопку "Далее". |
| |
| [start=3] |
| 1. Выберите команду "Создать проект модуля" и введите в поле "Имя модуля" *MyAPI*. Нажмите кнопку "Готово". |
| |
| При нажатии кнопки "Готово" в среде IDE создаются проект MavenSelectionSuite и подпроект модуля на платформе NetBeans MyAPI. |
| |
| image::images/maven-suite_maven-suite-projectswindow.png[title="Снимок экрана: окно "Проекты""] |
| |
| MavenSelectionSuite - это проект POM, являющийся контейнером для подпроектов, в данном случае - проектов модуля на платформе NetBeans. Проект POM не содержит исходных файлов. POM проекта содержит указания по компиляции набора. При его просмотре видно, что значение ``pom`` установлено для упаковки. |
| |
| |
| [source,xml] |
| ---- |
| |
| <modelVersion>4.0.0</modelVersion> |
| <groupId>com.mycompany</groupId> |
| <artifactId>MavenSelectionSuite</artifactId> |
| *<packaging>pom</packaging>* |
| <version>1.0-SNAPSHOT</version> |
| <name>MavenSelectionSuite Netbeans Module Suite</name> |
| ... |
| <properties> |
| <netbeans.version>RELEASE69</netbeans.version> |
| </properties> |
| *<modules> |
| <module>MyAPI</module> |
| </modules>* |
| </project> |
| ---- |
| |
| POM также содержит список модулей, включаемых при построении проекта POM. Обратите внимание, что проект MyAPI приведен в качестве модуля. |
| |
| Разверните узел "Модули" в окне "Проекты": проект MyAPI приводится в качестве модуля. В окне "Файлы" можно увидеть, что каталог проекта MyAPI расположен в каталоге ``MavenSelectionSuite`` . При создании нового проекта в каталоге проекта POM проект автоматически добавляется в среде IDE в список модулей, включаемых при построении и запуске проекта POM. |
| |
| При создании набора модулей на платформе NetBeans из архетипа Maven в мастере создания проекта не нужно указывать местоположение установки целевой платформы NetBeans, как это указывалось в среде Ant. Чтобы настроить установку платформы NetBeans, необходимо изменить элемент ``<netbeans.installation>`` в файле ``profiles.xml`` проекта POM и явным образом указать путь к установке платформы. Для получения дополнительных сведений обратитесь к разделу <<05b,Определение местоположения установки NetBeans>> в этом учебном курсе. |
| |
| |
| == Изменение модуля MyAPI |
| |
| Модуль MyAPI был построен при создании набора модулей, однако теперь в этом модуле необходимо создать класс и представить его для других модулей. |
| |
| |
| === Создание класса в модуле MyAPI |
| |
| В этом упражнении описано создание простого класса с именем ``APIObject`` . Все экземпляры класса ``APIObject`` уникальны, так как поле ``index`` увеличивается на единицу каждый раз при создании нового элемента ``APIObject`` . |
| |
| |
| [start=1] |
| 1. Разверните проект MyAPI в окне "Проекты". |
| |
| [start=2] |
| 1. Щелкните узел "Исходные файлы" правой кнопкой мыши и выберите "Создать" > "Java Class". |
| |
| [start=3] |
| 1. В поле "Имя класса" введите *APIObject* и выберите в контекстном меню "Пакет" ``com.mycompany.mavenselectionsuite`` . Нажмите кнопку "Готово". |
| |
| [start=4] |
| 1. Измените этот класс, чтобы объявить несколько полей и добавить следующие простые методы: |
| |
| [source,java] |
| ---- |
| |
| public final class APIObject { |
| |
| private final Date date = new Date(); |
| private static int count = 0; |
| private final int index; |
| |
| public APIObject() { |
| index = count++; |
| } |
| |
| public Date getDate() { |
| return date; |
| } |
| |
| public int getIndex() { |
| return index; |
| } |
| |
| public String toString() { |
| return index + " - " + date; |
| } |
| |
| } |
| ---- |
| |
| |
| [start=5] |
| 1. Исправьте операторы импорта и сохраните измененные данные. |
| |
| |
| === Определение общедоступных пакетов |
| |
| В этом учебном курсе будут созданы дополнительные модули, требуемые для получения доступа к методам в ``APIObject`` . В этом упражнении содержимое модуля MyAPI будет объявлено общедоступным, чтобы другие модули могли получить доступ к методам. Чтобы объявить пакет ``com.mycompany.mavenselectionsuite`` общедоступным, необходимо изменить элемент ``configuration`` в ``nbm-maven-plugin`` в POM для указания пакетов, экспортируемых как общедоступные. Изменения в POM можно внести непосредственно в редакторе либо в окне "Проекты", указав пакеты, экспортируемые как общедоступные. |
| |
| |
| [start=1] |
| 1. Щелкните узел проекта правой кнопкой мыши и выберите "Свойства", чтобы открыть окно свойств. |
| |
| [start=2] |
| 1. Выберите пакет *com.mycompany.mavenselectionsuite* в категории *Общедоступные пакеты*. Нажмите кнопку "ОК". |
| image::images/maven-suite_maven-suite-publicpackages.png[title="Категория "Общедоступные пакеты" в окне "Свойства""] |
| |
| При выборе экспортируемого пакета среда IDE изменяет элемент ``nbm-maven-plugin`` в POM, чтобы указать пакет. |
| |
| |
| [source,xml] |
| ---- |
| |
| <plugin> |
| <groupId>org.codehaus.mojo</groupId> |
| <artifactId>nbm-maven-plugin</artifactId> |
| <extensions>true</extensions> |
| <configuration> |
| <publicPackages> |
| *<publicPackage>com.mycompany.mavenselectionsuite</publicPackage>* |
| </publicPackages> |
| </configuration> |
| </plugin> |
| ---- |
| |
| |
| [start=3] |
| 1. Щелкните проект правой кнопкой мыши и выберите команду "Построить". |
| |
| При построении проекта элемент ``nbm-maven-plugin`` создает заголовок манифеста в ``MANIFEST.MF`` файла JAR, где указываются общедоступные пакеты. |
| |
| Для получения дополнительных сведений обратитесь к link:http://bits.netbeans.org/mavenutilities/nbm-maven-plugin/manifest-mojo.html#publicPackages[документации манифеста nbm-maven-plugin]. |
| |
| |
| == Создание модуля MyViewer |
| |
| В этом разделе будет создан новый модуль с именем MyViewer, а также добавлены оконный компонент и два текстовых поля. Этот компонент реализует ``LookupListener`` для прослушивания изменений в link:https://netbeans.apache.org/wiki/devfaqlookup[Lookup]. |
| |
| |
| === Создание модуля |
| |
| В этом упражнении будет создан модуль на платформе NetBeans MyViewer в каталоге ``MavenSelectionSuite`` . |
| |
| |
| [start=1] |
| 1. Выберите в главном меню "Файл" > "Новый проект" (CTRL+SHIFT+N). |
| |
| [start=2] |
| 1. Выберите модуль Maven NetBeans из категории Maven. Нажмите кнопку "Далее". |
| |
| [start=3] |
| 1. В поле "Имя проекта" введите *MyViewer*. |
| |
| [start=4] |
| 1. Подтвердите местоположение проекта - каталог ``MavenSelectionSuite`` . Нажмите кнопку "Готово". |
| |
| [start=5] |
| 1. В окне "Проекты" щелкните правой кнопкой мыши узел "Библиотеки" и выберите команду "Добавить зависимость". |
| |
| [start=6] |
| 1. На вкладке "Открыть проекты" выберите модуль на платформе NetBeans MyAPI. Нажмите кнопку "ОК". |
| image::images/maven-suite_maven-suite-addapi.png[title="Категория "Общедоступные пакеты" в окне "Свойства""] |
| |
| При нажатии кнопки "ОК" среда IDE добавляет артефакт в список зависимостей в POM и выводит его в узле "Библиотеки". |
| |
| Обратите внимание на POM для модуля MyViewer: вышестоящим проектом для модуля является MavenSelectionSuite, элемент ``nbm`` указан для ``packaging`` , а элемент *nbm-maven-plugin* используется для построения проекта как модуля на платформе NetBeans. |
| |
| |
| [source,xml] |
| ---- |
| |
| <modelVersion>4.0.0</modelVersion> |
| *<parent> |
| <groupId>com.mycompany</groupId> |
| <artifactId>MavenSelectionSuite</artifactId> |
| <version>1.0-SNAPSHOT</version> |
| </parent>* |
| <groupId>com.mycompany</groupId> |
| <artifactId>MyViewer</artifactId> |
| *<packaging>nbm</packaging>* |
| <version>1.0-SNAPSHOT</version> |
| <name>MyViewer NetBeans Module</name> |
| |
| ---- |
| |
| |
| === Создание оконного компонента |
| |
| В этом упражнении будет создан оконный компонент и добавлено два текстовых поля. |
| |
| |
| [start=1] |
| 1. Щелкните проект MyViewer правой кнопкой мыши и выберите "Создать" > "Окно". |
| |
| [start=2] |
| 1. Выберите в контекстном меню значение *navigator* и установите флажок "Открывать при запуске приложения". Нажмите кнопку "Далее". |
| |
| [start=3] |
| 1. В качестве префикса имени класса введите *MyViewer*. Нажмите кнопку "Готово". |
| |
| [start=4] |
| 1. Перетащите две метки из палитры в компонент и измените текст верхней метки на ``"[nothing selected]"`` . |
| image::images/maven-suite_maven-suite-myviewertopcomponent.png[title="Текстовые поля в оконном компоненте"] |
| |
| [start=5] |
| 1. Перейдите на вкладку "Исходный код" и измените сигнатуру класса, чтобы реализовать ``LookupListener`` . |
| |
| [source,java] |
| ---- |
| |
| public class MyViewerTopComponent extends TopComponent *implements LookupListener* { |
| ---- |
| |
| |
| [start=6] |
| 1. Реализуйте абстрактные методы, установив курсор в режиме вставки в строке и удерживая нажатыми клавиши ALT+ВВОД. |
| |
| [start=7] |
| 1. Добавьте результат поля ``private`` ``result`` и измените начальное значение на нулевое. |
| |
| [source,java] |
| ---- |
| |
| private Lookup.Result result = null; |
| ---- |
| |
| |
| [start=8] |
| 1. Внесите следующие изменения в методы ``componentOpened()`` , ``componentClosed()`` и ``resultChanged()`` : |
| |
| [source,java] |
| ---- |
| |
| public void componentOpened() { |
| *result = Utilities.actionsGlobalContext().lookupResult(APIObject.class); |
| result.addLookupListener(this);* |
| } |
| |
| public void componentClosed() { |
| *result.removeLookupListener (this); |
| result = null;* |
| } |
| |
| public void resultChanged(LookupEvent le) { |
| *Lookup.Result r = (Lookup.Result) le.getSource(); |
| Collection c = r.allInstances(); |
| if (!c.isEmpty()) { |
| APIObject o = (APIObject) c.iterator().next(); |
| jLabel1.setText (Integer.toString(o.getIndex())); |
| jLabel2.setText (o.getDate().toString()); |
| } else { |
| jLabel1.setText("[no selection]"); |
| jLabel2.setText (""); |
| }* |
| } |
| ---- |
| |
| При каждом открытии компонента с помощью `` link:http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/Utilities.html#actionsGlobalContext%28%29[Utilities.actionsGlobalContext()]`` можно предоставить классу возможность глобального прослушивания объекта поиска для выбранного компонента. Lookup удаляется при закрытии компонента. Метод ``resultChanged()`` реализует ``LookupListener`` , чтобы обновить метки JLabel в форме согласно выбранному объекту ``APIObject`` . |
| |
| |
| [start=9] |
| 1. Исправьте операторы импорта и убедитесь, что элемент * ``org.openide.util.Utilities`` * добавлен. Сохраните изменения. |
| |
| |
| == Создание модуля MyEditor |
| |
| В этом разделе будет создан новый модуль с именем MyEditor. Модуль будет содержать компонент `` link:http://bits.netbeans.org/dev/javadoc/org-openide-windows/org/openide/windows/TopComponent.html[TopComponent]`` , предлагающий экземпляры ``APIObject`` через Lookup. Также будут открыты новые экземпляры компонента MyEditor. |
| |
| |
| === Создание модуля |
| |
| В этом упражнении будет создан модуль на платформе NetBeans в каталоге ``MavenSelectionSuite`` и добавлена зависимость от модуля MyAPI. |
| |
| |
| [start=1] |
| 1. В главном меню выберите "Файл" > "Новый проект". |
| |
| [start=2] |
| 1. Выберите модуль Maven NetBeans из категории Maven. Нажмите кнопку "Далее". |
| |
| [start=3] |
| 1. В поле "Имя проекта" введите *MyEditor*. |
| |
| [start=4] |
| 1. Подтвердите местоположение проекта - каталог ``MavenSelectionSuite`` . Нажмите кнопку "Готово". |
| |
| [start=5] |
| 1. В окне "Проекты" щелкните правой кнопкой мыши узел проекта "Библиотеки" и выберите команду "Добавить зависимость". |
| |
| [start=6] |
| 1. На вкладке "Открыть проекты" выберите модуль на платформе NetBeans MyAPI. Нажмите кнопку "ОК". |
| |
| |
| === Добавление действия |
| |
| В этом упражнении будет создан класс, чтобы добавить в меню "Файл" пункт для открытия компонента с именем MyEditor. Этот компонент будет создан в следующем упражнении. |
| |
| |
| [start=1] |
| 1. Для открытия диалогового окна "Новое действие" щелкните проект MyEditor правой кнопкой мыши и выберите в меню "Создать" команду "Действие". |
| |
| [start=2] |
| 1. Укажите параметр "Всегда включено". Нажмите кнопку "Далее". |
| |
| [start=3] |
| 1. Оставьте значения по умолчанию на странице "Регистрация в интерфейсе". Нажмите кнопку "Далее". |
| |
| [start=4] |
| 1. В поле "Имя класса" введите *OpenEditorAction*. |
| |
| [start=5] |
| 1. В поле "Отображаемое имя" введите *Open Editor*. Нажмите кнопку "Готово". |
| |
| Среда IDE открывает в редакторе класс ``OpenEditorAction`` и добавляет в файл ``layer.xml`` следующие данные: |
| |
| |
| [source,xml] |
| ---- |
| |
| <filesystem> |
| <folder name="Actions"> |
| <folder name="Build"> |
| <file name="com-mycompany-myeditor-OpenEditorAction.instance"> |
| <attr name="delegate" newvalue="com.mycompany.myeditor.OpenEditorAction"/> |
| <attr name="displayName" bundlevalue="com.mycompany.myeditor.Bundle#CTL_OpenEditorAction"/> |
| <attr name="instanceCreate" methodvalue="org.openide.awt.Actions.alwaysEnabled"/> |
| <attr name="noIconInMenu" boolvalue="false"/> |
| </file> |
| </folder> |
| </folder> |
| <folder name="Menu"> |
| <folder name="File"> |
| <file name="com-mycompany-myeditor-OpenEditorAction.shadow"> |
| <attr name="originalFile" stringvalue="Actions/Build/com-mycompany-myeditor-OpenEditorAction.instance"/> |
| <attr name="position" intvalue="0"/> |
| </file> |
| </folder> |
| </folder> |
| </filesystem> |
| ---- |
| |
| |
| [start=6] |
| 1. Измените класс ``OpenEditorAction`` , чтобы изменить метод ``actionPerformed`` . |
| |
| [source,java] |
| ---- |
| |
| public void actionPerformed(ActionEvent e) { |
| MyEditor editor = new MyEditor(); |
| editor.open(); |
| editor.requestActive(); |
| } |
| ---- |
| |
| |
| === Добавление компонента редактора |
| |
| В этом упражнении будет создан компонент MyEditor, открывающийся в области редактора после вызова классом ``OpenEditorAction`` . Шаблон оконного компонента не будет использоваться, так как потребуется несколько экземпляров компонента и данный оконный компонент будет использоваться для создания единичных экземпляров. Вместо него будет использован шаблон формы JPanel. Затем для расширения компонента ``TopComponent`` указанный класс будет изменен. |
| |
| |
| [start=1] |
| 1. Щелкните правой кнопкой мыши "Исходные файлы", выберите "Создать" > "Прочее" и укажите в категории "Формы Swing GUI" форму JPanel. Нажмите кнопку "Далее". |
| |
| [start=2] |
| 1. В поле "Имя класса" введите *MyEditor* и укажите пакет ``com.mycompany.myeditor`` . Нажмите кнопку "Готово". |
| |
| [start=3] |
| 1. Перетащите в компонент два текстовых поля. |
| |
| [start=4] |
| 1. Отмените для всех текстовых полей выбор свойства ``editable`` , чтобы они были доступны только для чтения. |
| image::images/maven-suite_maven-suite-editableprop.png[title="Изменяемые свойства меток"] |
| |
| [start=5] |
| 1. Перейдите на вкладку "Исходный код" и измените сигнатуру класса, чтобы расширить ``TopComponent`` вместо ``javax.swing.JPanel`` . |
| |
| [source,java] |
| ---- |
| |
| public class MyEditor extends *TopComponent* |
| ---- |
| |
| |
| [start=6] |
| 1. Установите курсор в режиме вставки в сигнатуру и нажмите клавиши ALT+ВВОД, чтобы исправить ошибку в коде путем поиска репозитория Maven и добавления зависимости от артефакта ``org.openide.windows`` . Исправьте операторы импорта. |
| image::images/maven-suite_maven-suite-add-topcomponent.png[title="Изменяемые свойства меток"] |
| |
| [start=7] |
| 1. Измените конструктор, чтобы каждый раз при выборе класса создавать новый экземпляр ``APIObject`` . |
| |
| [source,java] |
| ---- |
| |
| public MyEditor() { |
| initComponents(); |
| *APIObject obj = new APIObject(); |
| associateLookup(Lookups.singleton(obj)); |
| jTextField1.setText("APIObject #" + obj.getIndex()); |
| jTextField2.setText("Created: " + obj.getDate()); |
| setDisplayName("MyEditor " + obj.getIndex());* |
| |
| } |
| ---- |
| |
| Строка ``associateLookup(Lookups.singleton(obj));`` в конструкторе создаст Lookup, содержащий новый экземпляр объекта ``APIObject`` . |
| |
| |
| [start=8] |
| 1. Исправьте операторы импорта и сохраните измененные данные. |
| |
| В текстовых полях в компоненте отображаются только индекс и дата объекта ``APIObject`` . Это позволит определить, что каждый компонент MyEditor уникален, а MyViewer выводит подробные данные выбранного компонента MyEditor. |
| |
| NOTE: Ошибки в ``OpenEditorAction`` будут разрешены после сохранения изменений в ``MyEditor`` . |
| |
| |
| == Сборка и запуск набора модулей |
| |
| Теперь можно запустить набор модулей, чтобы проверить корректность его сборки, установки и настройки. |
| |
| |
| === Объявление прямых зависимостей |
| |
| Перед построением и запуском набора модулей необходимо изменить одну из зависимостей проекта MyEditor. При попытке построения набора модулей прямо сейчас в окне "Вывод" появится сообщение о невозможности компиляции набора, так как модуль MyEditor требует доступности артефакта ``org.openide.util-lookup`` во время выполнения. |
| |
| Щелкните узел проекта правой кнопкой мыши и выберите команду "Показать график зависимостей", чтобы просмотреть зависимости модуля. |
| |
| |
| image::images/maven-suite_maven-suite-dependency-graph.png[title="График зависимостей артефакта"] |
| |
| Обратите внимание, что у MyEditor нет прямой зависимости от ``org.openide.util-lookup`` . Зависимость транзитивна, и артефакт доступен для проекта во время компиляции, однако зависимость должна быть прямой, если артефакт должен быть доступен во время выполнения. Необходимо изменить POM, чтобы объявить артефакт как прямую зависимость. |
| |
| Объявить артефакт как прямую зависимость можно двумя способами: вручную изменив POM либо с помощью соответствующего пункта контекстного меню в окне "Проекты". |
| |
| |
| [start=1] |
| 1. Разверните узел "Библиотеки" модуля MyEditor. |
| |
| [start=2] |
| 1. Щелкните правой кнопкой мыши артефакт ``org.openide.util-lookup`` и выберите команду "Объявить как прямую зависимость". |
| |
| При выборе команды "Объявить как прямую зависимость" среда IDE изменяет POM, чтобы добавить артефакт как зависимость. |
| |
| NOTE: Артефакт ``org.openide.util-lookup`` уже является прямой зависимостью модуля MyViewer. |
| |
| |
| === Определение местоположения установки NetBeans |
| |
| По умолчанию при использовании архетипа Maven для создания набора модулей на платформе NetBeans установка целевой платформы NetBeans не указывается. Чтобы установить и запустить набор модулей в среде IDE, необходимо указать путь к каталогу установки, изменив файл ``profiles.xml`` в проекте POM. |
| |
| |
| [start=1] |
| 1. Разверните узел "Файлы проекта" в приложении MavenSelectionSuite и дважды щелкните файл ``profiles.xml`` , чтобы открыть его в редакторе. |
| |
| [start=2] |
| 1. Измените элемент ``<netbeans.installation>`` , чтобы указать путь к целевой платформе NetBeans и сохранить изменения. |
| |
| [source,xml] |
| ---- |
| |
| <profile> |
| <id>netbeans-ide</id> |
| <properties> |
| <netbeans.installation>/home/me/netbeans-6.9</netbeans.installation> |
| </properties> |
| </profile> |
| ---- |
| |
| NOTE: Для этого пути необходимо указать каталог, содержащий каталог ``bin`` с выполняемым файлом. |
| |
| Например, в OS X путь может выглядеть следующим образом: |
| |
| |
| [source,xml] |
| ---- |
| |
| <netbeans.installation>/Applications/NetBeans/NetBeans6.9.app/Contents/Resources/NetBeans</netbeans.installation> |
| ---- |
| |
| |
| === Запуск приложения |
| |
| После указания местоположения установки целевой среды IDE можно использовать команду "Выполнить" для проекта набора. |
| |
| |
| [start=1] |
| 1. Щелкните MavenSelectionSuite правой кнопкой мыши и выберите команду "Выполнить". |
| |
| При выборе команды "Выполнить" экземпляр среды IDE запускает установленный набор модулей. |
| |
| |
| image::images/maven-suite_maven-suite-run1.png[title=" Окна My Viewer и MyEditor"] |
| |
| При запуске приложения откроется окно MyViewer, где отобразятся две текстовые метки. Теперь в меню "Файл" можно выбрать команду "Открыть редактор", чтобы открыть в области редактора компонент MyEditor. В окне MyViewer отобразятся подробные данные выбранного компонента MyEditor. |
| |
| Действие "Выполнить" настроено для проекта набора модулей по умолчанию, чтобы использовать подключаемый модуль Reactor для рекурсивного построения модулей набора и добавления их в пакет. Можно открыть окно "Свойства" проекта, чтобы просмотреть задачи Maven, сопоставленные с действиями в среде IDE. |
| |
| |
| image::images/maven-suite_maven-suite-run-action.png[title=" Окна My Viewer и MyEditor"] |
| |
| В категории "Действия" в окне "Свойства" можно увидеть задачи, сопоставленные с действием "Выполнить". |
| |
| |
| == Динамическое изменение Lookup |
| |
| Теперь каждый раз при открытии нового компонента MyEditor создается новый объект ``APIObject`` . В этом разделе к компоненту MyEditor будет добавлена кнопка, с помощью которой текущий ``APIObject`` компонента будет заменяться на новый. Будет изменен код для `` link:http://bits.netbeans.org/dev/javadoc/org-openide-util-lookup/org/openide/util/lookup/InstanceContent.html[InstanceContent]`` , чтобы выполнять динамическую обработку изменений в содержимом Lookup. |
| |
| |
| [start=1] |
| 1. Разверните проект MyEditor и откройте форму ``MyEditor`` в режиме проектирования в редакторе. |
| |
| [start=2] |
| 1. Перетащите кнопку в форму и измените текст кнопки на "Заменить". |
| |
| [start=3] |
| 1. Щелкните эту кнопку правой кнопкой мыши и выберите "События" > "Действие" > actionPerformed, чтобы создать метод обработчика события для кнопки и открыть форму в редакторе исходного кода. |
| |
| [start=4] |
| 1. Добавьте к классу следующее поле ``final`` : |
| |
| [source,java] |
| ---- |
| |
| public class MyEditor extends TopComponent { |
| *private final InstanceContent content = new InstanceContent();* |
| ---- |
| |
| Чтобы воспользоваться ``InstanceContent`` , в конструкторе необходимо использовать `` link:http://bits.netbeans.org/dev/javadoc/org-openide-util-lookup/org/openide/util/lookup/AbstractLookup.html#AbstractLookup%28org.openide.util.lookup.AbstractLookup.Content%29[AbstractLookup]`` вместо ``Lookup`` . |
| |
| |
| [start=5] |
| 1. Измените тело метода обработчика события ``jButton1ActionPerformed`` , скопировав строки из конструктора класса и добавив вызов в ``content.set`` . В результате метод должен выглядеть следующим образом: |
| |
| [source,java] |
| ---- |
| |
| private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { |
| *APIObject obj = new APIObject(); |
| jTextField1.setText ("APIObject #" + obj.getIndex()); |
| jTextField2.setText ("Created: " + obj.getDate()); |
| setDisplayName ("MyEditor " + obj.getIndex()); |
| content.set(Collections.singleton (obj), null);* |
| } |
| ---- |
| |
| |
| [start=6] |
| 1. Измените конструктор, чтобы удалить строки, скопированные в метод обработчика события, и измените ``associateLookup`` , чтобы использовать ``AbstractLookup`` и добавить ``jButton1ActionPerformed(null);`` . В результате конструктор должен выглядеть следующим образом: |
| |
| [source,java] |
| ---- |
| |
| public MyEditor() { |
| initComponents(); |
| *associateLookup(new AbstractLookup(content)); |
| jButton1ActionPerformed(null);* |
| } |
| ---- |
| |
| После добавления в конструктор ``jButton1ActionPerformed(null);`` можно убедиться, что компонент инициализируется при создании. |
| |
| |
| [start=7] |
| 1. Исправьте операторы импорта и сохраните измененные данные. |
| |
| При повторном запуске проекта набора модулей новая кнопка появится во всех компонентах MyEditor. При нажатии этой кнопки номер индекса в текстовых полях будет увеличиваться. Метка в окне MyViewer также будет обновляться в соответствии с новым значением. |
| |
| В данном учебном курсе были рассмотрены принципы создания набора модулей на платформе NetBeans с помощью архетипа Maven, а также принципы его запуска. Были рассмотрены структура набора модулей и процесс настройки POM модулей для указания общедоступных пакетов. Также был рассмотрен процесс изменения вышестоящего проекта POM для указания местоположения установки целевой платформы NetBeans, чтобы команда "Выполнить" в среде IDE устанавливала набор и запускала новый экземпляр платформы. Дополнительные примеры построения приложений и модулей на платформе NetBeans приведены в учебных курсах link:https://netbeans.apache.org/kb/docs/platform_ru.html[Учебной карты по платформе NetBeans]. |
| |
| |
| == Дополнительные сведения |
| |
| Дополнительные сведения о создании и разработке на платформе NetBeans приведены в следующих ресурсах: |
| |
| * link:https://netbeans.apache.org/kb/docs/platform_ru.html[Учебная карта по платформе NetBeans] |
| * link:https://netbeans.apache.org/wiki/[Часто задаваемые вопросы по разработке NetBeans ] |
| * link:http://bits.netbeans.org/dev/javadoc/[Документация Javadoc по интерфейсам API в среде NetBeans] |
| |
| Если у вас возникли вопросы по платформе NetBeans, можно отправить их в список рассылки dev@platform.netbeans.org либо ознакомиться с link:https://mail-archives.apache.org/mod_mbox/netbeans-dev/[Архивом списка рассылки по платформе NetBeans]. |
| |