| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
| <html xmlns="http://www.w3.org/1999/xhtml"> |
| <head> |
| <title>Работа с наборами модулей на платформе NetBeans с помощью Maven</title> |
| <link rel="stylesheet" type="text/css" href="https://netbeans.org/netbeans.css"/> |
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> |
| <meta name="AUDIENCE" content="NBUSER"/> |
| <meta name="TYPE" content="ARTICLE"/> |
| <meta name="EXPIRES" content="N"/> |
| <meta name="indexed" content="y"/> |
| <meta name="description" content="A short demonstration of how to use Maven to create and run a NetBeans Platform Module Suite."/> |
| <!-- Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. --> |
| <!-- Use is subject to license terms.--> |
| </head> |
| <body> |
| |
| <h1>Работа с наборами модулей на платформе NetBeans с помощью Maven</h1> |
| |
| <p>В этом документе описываются принципы создания набора модулей на платформе NetBeans из архетипов Maven, принципы построения и установки этого набора в среде IDE. В этом учебном курсе будет создан проект набора модулей Maven, содержащий три модуля на платформе NetBeans в качестве подпроектов. Проект Maven с подпроектами является простым проектом POM, объявляющим метод компиляции набора модулей и цель установки. |
| |
| </p> |
| |
| <p>Этот документ основан на <a href="https://platform.netbeans.org/tutorials/nbm-selection-1.html">Учебном курсе по управлению выбором NetBeans</a> на базе Ant и описывает различия между Ant и Maven при разработке наборов модулей на платформе NetBeans. После изучения отличий Maven от Ant можно легко пройти другие учебные курсы в <a href="https://netbeans.org/kb/trails/platform_ru.html">Учебной карте по платформе NetBeans</a>.</p> |
| |
| <p class="tips">При отсутствии опыта работы с платформой NetBeans можно посмотреть серию демонстрационных роликов <a href="https://platform.netbeans.org/tutorials/nbm-10-top-apis.html">10 лучших интерфейсов API NetBeans</a>.</p> |
| |
| <p><b>Содержимое</b></p> |
| <p><img src="../images/articles/69/netbeans-stamp69.png" class="stamp" width="114" height="114" alt="Содержимое на этой странице относится к среде IDE NetBeans 6.5, 6.7, 6.8" title="Содержимое на этой странице относится к среде IDE NetBeans 6.5, 6.7, 6.8" /></p> |
| |
| <ul class="toc"> |
| <li><a href="#config">Использование Maven в среде IDE</a> |
| <ul> |
| <li><a href="#config1">Настройка параметров Maven</a></li> |
| <li><a href="#config2">Просмотр репозиториев Maven</a></li> |
| </ul></li> |
| <li><a href="#01">Создание набора модулей на платформе NetBeans</a></li> |
| <li><a href="#02">Изменение модуля MyAPI</a> |
| <ul> |
| <li><a href="#02a">Создание класса</a></li> |
| <li><a href="#02b">Определение общедоступных пакетов</a></li> |
| </ul> |
| </li> |
| <li><a href="#03">Создание модуля MyViewer</a> |
| <ul> |
| <li><a href="#03b">Создание оконного компонента</a></li> |
| </ul> |
| </li> |
| <li><a href="#04">Создание модуля MyEditor</a> |
| <ul> |
| <li><a href="#04b">Добавление действия</a></li> |
| <li><a href="#04c">Добавление компонента редактора</a></li> |
| </ul> |
| </li> |
| <li><a href="#05">Сборка и запуск набора модулей</a> |
| <ul> |
| <li><a href="#05a">Объявление прямых зависимостей</a></li> |
| <li><a href="#05b">Определение местоположения установки NetBeans</a></li> |
| <li><a href="#05c">Запуск приложения</a></li> |
| </ul> |
| </li> |
| <li><a href="#06">Динамическое изменение Lookup</a></li> |
| </ul> |
| |
| <p><b>Для работы с этим учебным курсом требуется программное обеспечение и ресурсы, перечисленные в следующей таблице.</b></p> |
| |
| <table> |
| <tbody> |
| <tr> |
| <th class="tblheader" scope="col">Программное обеспечение или ресурс</th> |
| <th class="tblheader" scope="col">Требуемая версия</th> |
| </tr> |
| <tr> |
| <td class="tbltd1"><a href="http://download.netbeans.org/netbeans/6.9/beta/">Среда IDE NetBeans</a></td> |
| <td class="tbltd1">версия 6.9</td> |
| </tr> |
| <tr> |
| <td class="tbltd1"><a href="http://java.sun.com/javase/downloads/index.jsp">Комплект для разработчика на языке Java (JDK)</a></td> |
| <td class="tbltd1">Версия 6</td> |
| </tr> |
| <tr> |
| <td class="tbltd1"><a href="http://maven.apache.org/">Maven</a></td> |
| <td class="tbltd1">Версия 2.0.9 или более поздняя версия</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <p><strong class="notes">Примечание.</strong> Для разработки приложений на платформе NetBeans не требуется загружать отдельную версию этой платформы. Как правило, разработка приложений и модулей осуществляется в среде IDE NetBeans, затем необходимо просто включить требуемые модули для выполнения платформы NetBeans и созданного приложения.</p> |
| |
| <p>Перед изучением этого учебного курса можно ознакомиться со следующей документацией:</p> |
| <ul> |
| <li><a href="http://wiki.netbeans.org/NetBeansDeveloperFAQ">Часто задаваемые вопросы по разработке NetBeans </a></li> |
| <li><a href="http://wiki.netbeans.org/MavenBestPractices">Практические рекомендации по Apache Maven в NetBeans 6.x</a>;</li> |
| <li><a href="http://www.sonatype.com/books/maven-book/reference/introduction.html">Глава 1. Введение в Apache Maven</a> (из книги <a href="http://www.sonatype.com/books/maven-book/reference/public-book.html">Maven: полное руководство</a>)</li> |
| <li><a href="https://netbeans.org/kb/docs/java/gui-functionality_ru.html">Введение в разработку графического интерфейса </a></li> |
| </ul> |
| |
| |
| |
| |
| |
| |
| |
| <!-- =================================================================== --> |
| <!-- +++++++++++++++ Configuring Maven +++++++++++++++++++++++++++++++++ --> |
| |
| <h2><a name="config"></a>Использование Maven в среде IDE</h2> |
| <p>Если это первый опыт работы с Maven, следует проверить параметры настройки и обозреватель репозиториев Maven.</p> |
| |
| <div class="indent"> |
| <a name="config1"></a> |
| <h3>Настройка параметров Maven</h3> |
| <p>Для настройки поведения Maven в среде IDE и проверки корректности этой настройки перейдите на вкладку Maven в окне "Параметры".</p> |
| |
| <ol> |
| <li>Выберите категорию "Разное" в окне "Параметры" и перейдите на вкладку Maven.</li> |
| <li>Укажите папку установки Maven (требуется версия 2.0.9 или более поздняя).</li> |
| <li>Подтвердите корректность адреса к локальному репозиторию Maven.</li> |
| <li>Нажмите кнопку "ОК".</li> |
| </ol> |
| <p>В большинстве случаев при использовании типичной настройки Maven данные в окне "Параметры" уже корректны.</p> |
| |
| <p class="notes"><strong>Примечание.</strong> Поддержка Maven активируется как часть набора функциональных возможностей Java SE. Если в окне "Параметры" вкладка Maven недоступна, подтвердите активацию Java SE при создании приложения Java.</p> |
| |
| <h3><a name="config2"></a>Просмотр репозиториев Maven</h3> |
| <p>Артефакты, используемые Maven для создания всех проектов, сохраняются в локальном репозитории Maven. Если артефакт объявлен как зависимость проекта и еще не установлен, он загружается в локальный репозиторий из одного из зарегистрированных удаленных репозиториев.</p> |
| |
| <p>Репозиторий NetBeans и некоторые известные индексированные репозитории Maven зарегистрированы и включены в список окна "Обозреватель репозитория" по умолчанию. Репозиторий NetBeans содержит большинство общедоступных артефактов, требуемых для создания проекта. Обозреватель репозиториев Maven можно использовать для просмотра содержимого локальных и удаленных репозиториев. Для просмотра локальных артефактов разверните узел "Локальный репозиторий". Артефакты, указанные в узлах удаленного репозитория, могут быть добавлены в качестве зависимостей проекта, однако не все из них представлены локально. Они добавляются к локальному репозиторию только в том случае, если объявляются в качестве зависимостей проекта.</p> |
| |
| <p>Чтобы открыть обозреватель репозиториев Maven:</p> |
| <ul> |
| <li>выберите в главном меню "Окно" > "Прочее" > "Обозреватель репозиториев Maven".<br/> |
| <img src="../images/tutorials/maven-quickstart68/maven-nbm-netbeans-repo.png" alt="Снимок экрана: обозреватель репозиториев Maven" title="Снимок экрана: обозреватель репозиториев Maven" class="margin-around b-all" /> |
| |
| </li> |
| </ul> |
| </div> |
| |
| |
| |
| <!-- =================================================================== --> |
| <!-- +++++++++++++++++++ Creating the Module Suite +++++++++++++++++++++ --> |
| |
| <h2><a name="01"></a>Создание набора модулей на платформе NetBeans</h2> |
| <p>В этом разделе для построения набора модулей на платформе NetBeans из архетипа Maven используется мастер создания проекта. Мастер создает проект POM, содержащий проекты модулей. Также в мастере создается модуль в качестве подпроекта набора. |
| </p> |
| |
| <ol> |
| <li>Откройте мастер создания проекта и выберите в категории Maven "Набор модулей Maven NetBeans". Нажмите кнопку "Далее".</li> |
| <li>В поле "Имя проекта" введите <strong>MavenSelectionSuite</strong>. Нажмите кнопку "Далее".</li> |
| <li>Выберите команду "Создать проект модуля" и введите в поле "Имя модуля" <strong>MyAPI</strong>. Нажмите кнопку "Готово". </li> |
| </ol> |
| |
| <p>При нажатии кнопки "Готово" в среде IDE создаются проект MavenSelectionSuite и подпроект модуля на платформе NetBeans MyAPI.<br/> |
| <img src="../images/tutorials/maven-suite/maven-suite-projectswindow.png" alt="Снимок экрана: окно "Проекты"" title="Снимок экрана: окно "Проекты"" class="margin-around b-all" /> |
| </p> |
| |
| <p>MavenSelectionSuite - это проект POM, являющийся контейнером для подпроектов, в данном случае - проектов модуля на платформе NetBeans. Проект POM не содержит исходных файлов. POM проекта содержит указания по компиляции набора. При его просмотре видно, что значение <tt>pom</tt> установлено для упаковки.</p> |
| <pre class="examplecode"> <modelVersion>4.0.0</modelVersion> |
| <groupId>com.mycompany</groupId> |
| <artifactId>MavenSelectionSuite</artifactId> |
| <strong><packaging>pom</packaging></strong> |
| <version>1.0-SNAPSHOT</version> |
| <name>MavenSelectionSuite Netbeans Module Suite</name> |
| ... |
| <properties> |
| <netbeans.version>RELEASE69</netbeans.version> |
| </properties> |
| <strong><modules> |
| <module>MyAPI</module> |
| </modules></strong> |
| </project></pre> |
| <p>POM также содержит список модулей, включаемых при построении проекта POM. Обратите внимание, что проект MyAPI приведен в качестве модуля.</p> |
| |
| <p>Разверните узел "Модули" в окне "Проекты": проект MyAPI приводится в качестве модуля. В окне "Файлы" можно увидеть, что каталог проекта MyAPI расположен в каталоге <tt>MavenSelectionSuite</tt>. При создании нового проекта в каталоге проекта POM проект автоматически добавляется в среде IDE в список модулей, включаемых при построении и запуске проекта POM.</p> |
| |
| <!--<p>The project also contains other XML files containing metadata about the project such as <tt>profiles.xml</tt>. |
| The <tt>profiles.xml</tt> file specifies the path to the NetBeans installation and is used by the IDE when running the project. |
| --> |
| |
| <p class="tips">При создании набора модулей на платформе NetBeans из архетипа Maven в мастере создания проекта не нужно указывать местоположение установки целевой платформы NetBeans, как это указывалось в среде Ant. Чтобы настроить установку платформы NetBeans, необходимо изменить элемент <tt><netbeans.installation></tt> в файле <tt>profiles.xml</tt> проекта POM и явным образом указать путь к установке платформы. Для получения дополнительных сведений обратитесь к разделу <a href="#05b">Определение местоположения установки NetBeans</a> в этом учебном курсе.</p> |
| <!--see https://netbeans.org/bugzilla/show_bug.cgi?id=185941.--> |
| |
| |
| |
| <!-- =================================================================== --> |
| <!-- ++++++++++++++++++ Adding Class to MyAPI Module +++++++++++++++++++ --> |
| |
| <h2><a name="02"></a>Изменение модуля MyAPI</h2> |
| <p>Модуль MyAPI был построен при создании набора модулей, однако теперь в этом модуле необходимо создать класс и представить его для других модулей.</p> |
| |
| <div class="indent"> |
| <a name="02a"></a> |
| <h3>Создание класса в модуле MyAPI </h3> |
| <p>В этом упражнении описано создание простого класса с именем <tt>APIObject</tt>. Все экземпляры класса <tt>APIObject</tt> уникальны, так как поле <tt>index</tt> увеличивается на единицу каждый раз при создании нового элемента <tt>APIObject</tt>.</p> |
| <ol> |
| <li>Разверните проект MyAPI в окне "Проекты". </li> |
| <li>Щелкните узел "Исходные файлы" правой кнопкой мыши и выберите "Создать" > "Java Class". </li> |
| <li>В поле "Имя класса" введите <strong>APIObject</strong> и выберите в контекстном меню "Пакет" <tt>com.mycompany.mavenselectionsuite</tt>. Нажмите кнопку "Готово". </li> |
| <li>Измените этот класс, чтобы объявить несколько полей и добавить следующие простые методы: |
| <pre class="examplecode"> |
| 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; |
| } |
| |
| }</pre> |
| </li> |
| <li>Исправьте операторы импорта и сохраните измененные данные.</li> |
| </ol> |
| |
| <a name="02b"></a> |
| <h3>Определение общедоступных пакетов</h3> |
| <p>В этом учебном курсе будут созданы дополнительные модули, требуемые для получения доступа к методам в <tt>APIObject</tt>. В этом упражнении содержимое модуля MyAPI будет объявлено общедоступным, чтобы другие модули могли получить доступ к методам. Чтобы объявить пакет <tt>com.mycompany.mavenselectionsuite</tt> общедоступным, необходимо изменить элемент <tt>configuration</tt> в <tt>nbm-maven-plugin</tt> в POM для указания пакетов, экспортируемых как общедоступные. Изменения в POM можно внести непосредственно в редакторе либо в окне "Проекты", указав пакеты, экспортируемые как общедоступные.</p> |
| |
| <ol> |
| <li>Щелкните узел проекта правой кнопкой мыши и выберите "Свойства", чтобы открыть окно свойств.</li> |
| <li>Выберите пакет <strong>com.mycompany.mavenselectionsuite</strong> в категории <strong>Общедоступные пакеты</strong>. Нажмите кнопку "ОК". <img src="../images/tutorials/maven-suite/maven-suite-publicpackages.png" alt="Снимок экрана: категория "Общедоступные пакеты" в окне "Свойства"" title="Категория "Общедоступные пакеты" в окне "Свойства"" class="margin-around b-all" /> |
| <p>При выборе экспортируемого пакета среда IDE изменяет элемент <tt>nbm-maven-plugin</tt> в POM, чтобы указать пакет.</p> |
| <pre class="examplecode"><plugin> |
| <groupId>org.codehaus.mojo</groupId> |
| <artifactId>nbm-maven-plugin</artifactId> |
| <extensions>true</extensions> |
| <configuration> |
| <publicPackages> |
| <strong><publicPackage>com.mycompany.mavenselectionsuite</publicPackage></strong> |
| </publicPackages> |
| </configuration> |
| </plugin></pre></li> |
| <li>Щелкните проект правой кнопкой мыши и выберите команду "Построить".</li> |
| </ol> |
| |
| <p>При построении проекта элемент <tt>nbm-maven-plugin</tt> создает заголовок манифеста в <tt>MANIFEST.MF</tt> файла JAR, где указываются общедоступные пакеты. </p> |
| |
| <p class="tips">Для получения дополнительных сведений обратитесь к <a href="http://mojo.codehaus.org/nbm-maven-plugin/manifest-mojo.html#publicPackages">документации манифеста nbm-maven-plugin</a>.</p> |
| </div> |
| |
| <!-- =================================================================== --> |
| <!-- ++++++++++++++++++ Creating the MyViewer Module +++++++++++++++++++ --> |
| |
| <h2><a name="03"></a>Создание модуля MyViewer</h2> |
| <p>В этом разделе будет создан новый модуль с именем MyViewer, а также добавлены оконный компонент и два текстовых поля. Этот компонент реализует <tt>LookupListener<a href="http://bits.netbeans.org/dev/javadoc/org-openide-util-lookup/org/openide/util/LookupListener.html"></a></tt> для прослушивания изменений в <a href="http://wiki.netbeans.org/DevFaqLookup">Lookup</a>.</p> |
| |
| <div class="indent"> |
| <h3><a name="03a"></a>Создание модуля</h3> |
| <p>В этом упражнении будет создан модуль на платформе NetBeans MyViewer в каталоге <tt>MavenSelectionSuite</tt>.</p> |
| |
| <ol> |
| <li>Выберите в главном меню "Файл" > "Новый проект" (CTRL+SHIFT+N). </li> |
| <li>Выберите модуль Maven NetBeans из категории Maven. Нажмите кнопку "Далее".</li> |
| <li>В поле "Имя проекта" введите <strong>MyViewer</strong>.</li> |
| <li>Подтвердите местоположение проекта - каталог <tt>MavenSelectionSuite</tt>. Нажмите кнопку "Готово". </li> |
| <li>В окне "Проекты" щелкните правой кнопкой мыши узел "Библиотеки" и выберите команду "Добавить зависимость".</li> |
| <li>На вкладке "Открыть проекты" выберите модуль на платформе NetBeans MyAPI. Нажмите кнопку "ОК".<br/> |
| <img src="../images/tutorials/maven-suite/maven-suite-addapi.png" alt="Снимок экрана: категория "Общедоступные пакеты" в окне "Свойства"" title="Категория "Общедоступные пакеты" в окне "Свойства"" class="margin-around b-all" /> |
| </li> |
| </ol> |
| |
| <p>При нажатии кнопки "ОК" среда IDE добавляет артефакт в список зависимостей в POM и выводит его в узле "Библиотеки". </p> |
| |
| <p>Обратите внимание на POM для модуля MyViewer: вышестоящим проектом для модуля является MavenSelectionSuite, элемент <tt>nbm</tt> указан для <tt>packaging</tt>, а элемент <strong>nbm-maven-plugin</strong> используется для построения проекта как модуля на платформе NetBeans.</p> |
| |
| <pre class="examplecode"> |
| <modelVersion>4.0.0</modelVersion> |
| <strong><parent> |
| <groupId>com.mycompany</groupId> |
| <artifactId>MavenSelectionSuite</artifactId> |
| <version>1.0-SNAPSHOT</version> |
| </parent></strong> |
| <groupId>com.mycompany</groupId> |
| <artifactId>MyViewer</artifactId> |
| <strong><packaging>nbm</packaging></strong> |
| <version>1.0-SNAPSHOT</version> |
| <name>MyViewer NetBeans Module</name> |
| </pre> |
| |
| |
| <a name="03b"></a> |
| <h3>Создание оконного компонента</h3> |
| <p>В этом упражнении будет создан оконный компонент и добавлено два текстовых поля.</p> |
| <ol> |
| <li>Щелкните проект MyViewer правой кнопкой мыши и выберите "Создать" > "Окно".</li> |
| <li>Выберите в контекстном меню значение <strong>navigator</strong> и установите флажок "Открывать при запуске приложения". Нажмите кнопку "Далее".</li> |
| <li>В качестве префикса имени класса введите <strong>MyViewer</strong>. Нажмите кнопку "Готово". </li> |
| <li>Перетащите две метки из палитры в компонент и измените текст верхней метки на <tt>"[nothing selected]"</tt>.<br/> |
| <img src="../images/tutorials/maven-suite/maven-suite-myviewertopcomponent.png" alt="Снимок экрана: оконный компонент" title="Текстовые поля в оконном компоненте" class="margin-around b-all" /> |
| |
| </li> |
| <li>Перейдите на вкладку "Исходный код" и измените сигнатуру класса, чтобы реализовать <tt>LookupListener</tt>. |
| <pre class="examplecode">public class MyViewerTopComponent extends TopComponent <strong>implements LookupListener</strong> {</pre></li> |
| <li>Реализуйте абстрактные методы, установив курсор в режиме вставки в строке и удерживая нажатыми клавиши ALT+ВВОД.</li> |
| <li>Добавьте результат поля <tt>private</tt> <tt>result</tt> и измените начальное значение на нулевое. |
| <pre class="examplecode">private Lookup.Result result = null;</pre></li> |
| <li>Внесите следующие изменения в методы <tt>componentOpened()</tt>, <tt>componentClosed()</tt> и <tt>resultChanged()</tt>: |
| <pre class="examplecode"> |
| public void componentOpened() { |
| <strong>result = Utilities.actionsGlobalContext().lookupResult(APIObject.class); |
| result.addLookupListener(this);</strong> |
| } |
| |
| public void componentClosed() { |
| <strong>result.removeLookupListener (this); |
| result = null;</strong> |
| } |
| |
| public void resultChanged(LookupEvent le) { |
| <strong>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 (""); |
| }</strong> |
| }</pre> |
| <p>При каждом открытии компонента с помощью <tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/Utilities.html#actionsGlobalContext%28%29">Utilities.actionsGlobalContext()</a></tt> можно предоставить классу возможность глобального прослушивания объекта поиска для выбранного компонента. Lookup удаляется при закрытии компонента. Метод <tt>resultChanged()</tt> реализует <tt>LookupListener</tt>, чтобы обновить метки JLabel в форме согласно выбранному объекту <tt>APIObject</tt>.</p> |
| </li> |
| <li>Исправьте операторы импорта и убедитесь, что элемент <strong><tt>org.openide.util.Utilities</tt></strong> добавлен. Сохраните изменения.</li> |
| </ol> |
| </div> |
| |
| |
| |
| <!-- =================================================================== --> |
| <!-- ++++++++++++++++++ Creating the MyEditor Module +++++++++++++++++++ --> |
| |
| <h2><a name="04"></a>Создание модуля MyEditor</h2> |
| |
| <p>В этом разделе будет создан новый модуль с именем MyEditor. Модуль будет содержать компонент <tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-windows/org/openide/windows/TopComponent.html">TopComponent</a></tt>, предлагающий экземпляры <tt>APIObject</tt> через Lookup. Также будут открыты новые экземпляры компонента MyEditor.</p> |
| |
| <div class="indent"> |
| <a name="04a"></a> |
| <h3>Создание модуля</h3> |
| <p>В этом упражнении будет создан модуль на платформе NetBeans в каталоге <tt>MavenSelectionSuite</tt> и добавлена зависимость от модуля MyAPI.</p> |
| <ol> |
| <li>В главном меню выберите "Файл" > "Новый проект".</li> |
| <li>Выберите модуль Maven NetBeans из категории Maven. Нажмите кнопку "Далее".</li> |
| <li>В поле "Имя проекта" введите <strong>MyEditor</strong>.</li> |
| <li>Подтвердите местоположение проекта - каталог <tt>MavenSelectionSuite</tt>. Нажмите кнопку "Готово". </li> |
| <li>В окне "Проекты" щелкните правой кнопкой мыши узел проекта "Библиотеки" и выберите команду "Добавить зависимость".</li> |
| <li>На вкладке "Открыть проекты" выберите модуль на платформе NetBeans MyAPI. Нажмите кнопку "ОК".</li> |
| </ol> |
| |
| <a name="04b"></a> |
| <h3>Добавление действия</h3> |
| <p>В этом упражнении будет создан класс, чтобы добавить в меню "Файл" пункт для открытия компонента с именем MyEditor. Этот компонент будет создан в следующем упражнении.</p> |
| <!-- issue: https://netbeans.org/bugzilla/show_bug.cgi?id=186876 |
| In this section you need to create the action first, then the component. |
| If the component is created first, the New Action wizard will choke on what looks like |
| a lockedFile exception on the bundle.properties and the entries for the action are not generated in layer.xml.--> |
| |
| <ol> |
| <li>Для открытия диалогового окна "Новое действие" щелкните проект MyEditor правой кнопкой мыши и выберите в меню "Создать" команду "Действие".</li> |
| <li>Укажите параметр "Всегда включено". Нажмите кнопку "Далее".</li> |
| <li>Оставьте значения по умолчанию на странице "Регистрация в интерфейсе". Нажмите кнопку "Далее".</li> |
| <li>В поле "Имя класса" введите <strong>OpenEditorAction</strong>.</li> |
| <li>В поле "Отображаемое имя" введите <strong>Open Editor</strong>. Нажмите кнопку "Готово". |
| |
| <p>Среда IDE открывает в редакторе класс <tt>OpenEditorAction</tt> и добавляет в файл <tt>layer.xml</tt> следующие данные:</p> |
| <pre class="examplecode"> |
| <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></pre></li> |
| <li>Измените класс <tt>OpenEditorAction</tt>, чтобы изменить метод <tt>actionPerformed</tt>. |
| <pre class="examplecode">public void actionPerformed(ActionEvent e) { |
| MyEditor editor = new MyEditor(); |
| editor.open(); |
| editor.requestActive(); |
| }</pre></li> |
| </ol> |
| |
| |
| <a name="04c"></a> |
| <h3>Добавление компонента редактора</h3> |
| <p>В этом упражнении будет создан компонент MyEditor, открывающийся в области редактора после вызова классом <tt>OpenEditorAction</tt>. Шаблон оконного компонента не будет использоваться, так как потребуется несколько экземпляров компонента и данный оконный компонент будет использоваться для создания единичных экземпляров. Вместо него будет использован шаблон формы JPanel. Затем для расширения компонента <tt>TopComponent</tt> указанный класс будет изменен.</p> |
| |
| |
| <ol> |
| <li>Щелкните правой кнопкой мыши "Исходные файлы", выберите "Создать" > "Прочее" и укажите в категории "Формы Swing GUI" форму JPanel. Нажмите кнопку "Далее".</li> |
| <li>В поле "Имя класса" введите <strong>MyEditor</strong> и укажите пакет <tt>com.mycompany.myeditor</tt>. Нажмите кнопку "Готово". </li> |
| <li>Перетащите в компонент два текстовых поля.</li> |
| <li>Отмените для всех текстовых полей выбор свойства <tt>editable</tt>, чтобы они были доступны только для чтения.<br/> |
| <img src="../images/tutorials/maven-suite/maven-suite-editableprop.png" alt="Снимок экрана: изменяемые свойства меток" title="Изменяемые свойства меток" class="margin-around b-all" /> |
| |
| </li> |
| <li>Перейдите на вкладку "Исходный код" и измените сигнатуру класса, чтобы расширить <tt>TopComponent</tt> вместо <tt>javax.swing.JPanel</tt>. |
| <pre class="examplecode">public class MyEditor extends <strong>TopComponent</strong></pre></li> |
| <li>Установите курсор в режиме вставки в сигнатуру и нажмите клавиши ALT+ВВОД, чтобы исправить ошибку в коде путем поиска репозитория Maven и добавления зависимости от артефакта <tt>org.openide.windows</tt>. Исправьте операторы импорта.<br/> |
| <img src="../images/tutorials/maven-suite/maven-suite-add-topcomponent.png" alt="Снимок экрана: изменяемые свойства меток" title="Изменяемые свойства меток" class="margin-around b-all" /> |
| |
| </li> |
| <li>Измените конструктор, чтобы каждый раз при выборе класса создавать новый экземпляр <tt>APIObject</tt>. |
| <pre class="examplecode"> |
| public MyEditor() { |
| initComponents(); |
| <strong>APIObject obj = new APIObject(); |
| associateLookup(Lookups.singleton(obj)); |
| jTextField1.setText("APIObject #" + obj.getIndex()); |
| jTextField2.setText("Created: " + obj.getDate()); |
| setDisplayName("MyEditor " + obj.getIndex());</strong> |
| |
| }</pre> |
| <p>Строка <tt>associateLookup(Lookups.singleton(obj));</tt> в конструкторе создаст Lookup, содержащий новый экземпляр объекта <tt>APIObject</tt>.</p></li> |
| <li>Исправьте операторы импорта и сохраните измененные данные.</li> |
| </ol> |
| <p>В текстовых полях в компоненте отображаются только индекс и дата объекта <tt>APIObject</tt>. Это позволит определить, что каждый компонент MyEditor уникален, а MyViewer выводит подробные данные выбранного компонента MyEditor.</p> |
| |
| <p class="notes"><strong>Примечание.</strong> Ошибки в <tt>OpenEditorAction</tt> будут разрешены после сохранения изменений в <tt>MyEditor</tt>. </p> |
| </div> |
| |
| |
| |
| <!-- =================================================================== --> |
| <!-- ++++++++++++++++ Building and Running the Module +++++++++++++++++ --> |
| |
| <h2><a name="05"></a>Сборка и запуск набора модулей</h2> |
| <p>Теперь можно запустить набор модулей, чтобы проверить корректность его сборки, установки и настройки.</p> |
| <div class="indent"> |
| |
| |
| <a name="05a"></a> |
| <h3>Объявление прямых зависимостей</h3> |
| <p>Перед построением и запуском набора модулей необходимо изменить одну из зависимостей проекта MyEditor. При попытке построения набора модулей прямо сейчас в окне "Вывод" появится сообщение о невозможности компиляции набора, так как модуль MyEditor требует доступности артефакта <tt>org.openide.util-lookup</tt> во время выполнения.</p> |
| |
| <p>Щелкните узел проекта правой кнопкой мыши и выберите команду "Показать график зависимостей", чтобы просмотреть зависимости модуля. </p> |
| <img src="../images/tutorials/maven-suite/maven-suite-dependency-graph.png" alt="Снимок экрана: график зависимостей артефакта" title="График зависимостей артефакта" class="margin-around b-all" /> |
| |
| <p>Обратите внимание, что у MyEditor нет прямой зависимости от <tt>org.openide.util-lookup</tt>. Зависимость транзитивна, и артефакт доступен для проекта во время компиляции, однако зависимость должна быть прямой, если артефакт должен быть доступен во время выполнения. Необходимо изменить POM, чтобы объявить артефакт как прямую зависимость.</p> |
| |
| <p>Объявить артефакт как прямую зависимость можно двумя способами: вручную изменив POM либо с помощью соответствующего пункта контекстного меню в окне "Проекты".</p> |
| |
| <ol> |
| <li>Разверните узел "Библиотеки" модуля MyEditor. </li> |
| <li>Щелкните правой кнопкой мыши артефакт <tt>org.openide.util-lookup</tt> и выберите команду "Объявить как прямую зависимость". |
| <p>При выборе команды "Объявить как прямую зависимость" среда IDE изменяет POM, чтобы добавить артефакт как зависимость. </p> |
| </li> |
| </ol> |
| <p class="notes"><strong>Примечание.</strong> Артефакт <tt>org.openide.util-lookup</tt> уже является прямой зависимостью модуля MyViewer.</p> |
| |
| |
| <a name="05b"></a> |
| <h3>Определение местоположения установки NetBeans</h3> |
| <p>По умолчанию при использовании архетипа Maven для создания набора модулей на платформе NetBeans установка целевой платформы NetBeans не указывается. Чтобы установить и запустить набор модулей в среде IDE, необходимо указать путь к каталогу установки, изменив файл <tt>profiles.xml</tt> в проекте POM.</p> |
| <ol> |
| <li>Разверните узел "Файлы проекта" в приложении MavenSelectionSuite и дважды щелкните файл <tt>profiles.xml</tt>, чтобы открыть его в редакторе.</li> |
| <li>Измените элемент <tt><netbeans.installation></tt>, чтобы указать путь к целевой платформе NetBeans и сохранить изменения. |
| <pre class="examplecode"> |
| <profile> |
| <id>netbeans-ide</id> |
| <properties> |
| <netbeans.installation>/home/me/netbeans-6.9</netbeans.installation> |
| </properties> |
| </profile></pre> |
| <p class="notes"><strong>Примечание.</strong> Для этого пути необходимо указать каталог, содержащий каталог <tt>bin</tt> с выполняемым файлом.</p> |
| <p>Например, в OS X путь может выглядеть следующим образом: </p> |
| <pre class="examplecode"><netbeans.installation>/Applications/NetBeans/NetBeans6.9.app/Contents/Resources/NetBeans</netbeans.installation></pre> |
| </li> |
| </ol> |
| |
| |
| |
| <a name="05c"></a> |
| <h3>Запуск приложения</h3> |
| <p>После указания местоположения установки целевой среды IDE можно использовать команду "Выполнить" для проекта набора.</p> |
| |
| <ol> |
| <li>Щелкните MavenSelectionSuite правой кнопкой мыши и выберите команду "Выполнить".</li> |
| </ol> |
| <p>При выборе команды "Выполнить" экземпляр среды IDE запускает установленный набор модулей. </p> |
| <img src="../images/tutorials/maven-suite/maven-suite-run1.png" alt="Снимок экрана: окна My Viewer и MyEditor" title=" Окна My Viewer и MyEditor" class="margin-around b-all" /> |
| <p>При запуске приложения откроется окно MyViewer, где отобразятся две текстовые метки. Теперь в меню "Файл" можно выбрать команду "Открыть редактор", чтобы открыть в области редактора компонент MyEditor. В окне MyViewer отобразятся подробные данные выбранного компонента MyEditor.</p> |
| <p>Действие "Выполнить" настроено для проекта набора модулей по умолчанию, чтобы использовать подключаемый модуль Reactor для рекурсивного построения модулей набора и добавления их в пакет. Можно открыть окно "Свойства" проекта, чтобы просмотреть задачи Maven, сопоставленные с действиями в среде IDE. |
| </p> |
| <img src="../images/tutorials/maven-suite/maven-suite-run-action.png" alt="Снимок экрана: окна My Viewer и MyEditor" title=" Окна My Viewer и MyEditor" class="margin-around b-all" /> |
| <p>В категории "Действия" в окне "Свойства" можно увидеть задачи, сопоставленные с действием "Выполнить".</p> |
| </div> |
| |
| |
| |
| |
| <!-- =================================================================== --> |
| <!-- ++++++++++++++++ Modifying the Lookup with Button +++++++++++++++++ --> |
| |
| <h2><a name="06"></a>Динамическое изменение Lookup</h2> |
| <p>Теперь каждый раз при открытии нового компонента MyEditor создается новый объект <tt>APIObject</tt>. В этом разделе к компоненту MyEditor будет добавлена кнопка, с помощью которой текущий <tt>APIObject</tt> компонента будет заменяться на новый. Будет изменен код для <tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-util-lookup/org/openide/util/lookup/InstanceContent.html">InstanceContent</a></tt>, чтобы выполнять динамическую обработку изменений в содержимом Lookup.</p> |
| <ol> |
| <li>Разверните проект MyEditor и откройте форму <tt>MyEditor</tt> в режиме проектирования в редакторе.</li> |
| <li>Перетащите кнопку в форму и измените текст кнопки на "Заменить".</li> |
| <li>Щелкните эту кнопку правой кнопкой мыши и выберите "События" > "Действие" > actionPerformed, чтобы создать метод обработчика события для кнопки и открыть форму в редакторе исходного кода.</li> |
| <li>Добавьте к классу следующее поле <tt>final</tt>: |
| <pre class="examplecode">public class MyEditor extends TopComponent { |
| <strong>private final InstanceContent content = new InstanceContent();</strong></pre> |
| |
| <p>Чтобы воспользоваться <tt>InstanceContent</tt>, в конструкторе необходимо использовать <tt><a href="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</a></tt> вместо <tt>Lookup</tt>.</p> |
| </li> |
| <li>Измените тело метода обработчика события <tt>jButton1ActionPerformed</tt>, скопировав строки из конструктора класса и добавив вызов в <tt>content.set</tt>. В результате метод должен выглядеть следующим образом: |
| <pre class="examplecode">private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { |
| <strong>APIObject obj = new APIObject(); |
| jTextField1.setText ("APIObject #" + obj.getIndex()); |
| jTextField2.setText ("Created: " + obj.getDate()); |
| setDisplayName ("MyEditor " + obj.getIndex()); |
| content.set(Collections.singleton (obj), null);</strong> |
| }</pre> |
| </li> |
| <li>Измените конструктор, чтобы удалить строки, скопированные в метод обработчика события, и измените <tt>associateLookup</tt>, чтобы использовать <tt>AbstractLookup</tt> и добавить <tt>jButton1ActionPerformed(null);</tt>. В результате конструктор должен выглядеть следующим образом: |
| <pre class="examplecode"> public MyEditor() { |
| initComponents(); |
| <strong>associateLookup(new AbstractLookup(content)); |
| jButton1ActionPerformed(null);</strong> |
| }</pre> |
| <p>После добавления в конструктор <tt>jButton1ActionPerformed(null);</tt> можно убедиться, что компонент инициализируется при создании.</p></li> |
| <li>Исправьте операторы импорта и сохраните измененные данные.</li> |
| </ol> |
| |
| |
| <p>При повторном запуске проекта набора модулей новая кнопка появится во всех компонентах MyEditor. При нажатии этой кнопки номер индекса в текстовых полях будет увеличиваться. Метка в окне MyViewer также будет обновляться в соответствии с новым значением.</p> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| <p>В данном учебном курсе были рассмотрены принципы создания набора модулей на платформе NetBeans с помощью архетипа Maven, а также принципы его запуска. Были рассмотрены структура набора модулей и процесс настройки POM модулей для указания общедоступных пакетов. Также был рассмотрен процесс изменения вышестоящего проекта POM для указания местоположения установки целевой платформы NetBeans, чтобы команда "Выполнить" в среде IDE устанавливала набор и запускала новый экземпляр платформы. Дополнительные примеры построения приложений и модулей на платформе NetBeans приведены в учебных курсах <a href="https://netbeans.org/kb/trails/platform_ru.html">Учебной карты по платформе NetBeans</a>.</p> |
| |
| |
| <!-- ======================================================================================== --> |
| |
| |
| <h2><a name="nextsteps"></a>Дополнительные сведения</h2> |
| |
| <p>Дополнительные сведения о создании и разработке на платформе NetBeans приведены в следующих ресурсах:</p> |
| <ul> |
| <li><a href="https://netbeans.org/kb/trails/platform_ru.html">Учебная карта по платформе NetBeans</a></li> |
| <li><a href="http://wiki.netbeans.org/NetBeansDeveloperFAQ">Часто задаваемые вопросы по разработке NetBeans </a></li> |
| <li><a href="http://bits.netbeans.org/dev/javadoc/">Документация Javadoc по интерфейсам API в среде NetBeans</a></li> |
| </ul> |
| <p>Если у вас возникли вопросы по платформе NetBeans, можно отправить их в список рассылки dev@platform.netbeans.org либо ознакомиться с <a href="https://netbeans.org/projects/platform/lists/dev/archive">Архивом списка рассылки по платформе NetBeans</a>.</p> |
| |
| |
| <!-- ======================================================================================== --> |
| |
| |
| |
| </body> |
| |
| </html> |