// 
//     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.
//

= Создание приложения уровня предприятия с помощью Maven
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Создание приложения уровня предприятия с помощью Maven - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Создание приложения уровня предприятия с помощью Maven

This tutorial demonstrates how to create a simple enterprise application using IDE NetBeans and Maven archetypes. Также приводится ряд пояснений и советов по созданию и сборке приложений Maven в среде IDE.

В этом учебном курсе описывается создание приложения уровня предприятия, которое пакетируется в архивный файл EAR и развертывается на сервере приложений GlassFish Server Open Source Edition 3. Приложение создается с использованием архетипа приложения Maven Enterprise в мастере создания проекта. В приложение входит проект EJB, содержащий класс сущностей с сохранением состояния, компонент, управляемый сообщениями, и фасад сеансного компонента для сущности. В приложение также входит веб-проект, содержащий два сервлета.

*Упражнения по темам руководства*

* <<intro,Использование Maven в среде IDE>>
* <<Exercise_1,Создание проекта приложения уровня предприятия Maven>>
* <<Exercise_2,Написание кода модуля EJB>>
* <<Exercise_2a,Создание блока сохранения состояния>>
* <<Exercise_2b,Создание класса сущностей>>
* <<Exercise_2c,Создание управляемого сообщениями компонента>>
* <<Exercise_2d,Создание фасада сеанса>>
* <<Exercise_3,Написание кода веб-модуля>>
* <<Exercise_3a,Создание сервлета ListNews>>
* <<Exercise_3b,Создание сервлета PostMessage>>
* <<Exercise_4,Сборка приложения с помощью Maven>>
* <<Exercise_4a,Работа с зависимостями проекта>>
* <<Exercise_4b,Сборка проекта с зависимостями>>
* <<Exercise_5,Развертывание и выполнение приложения>>
* <<Exercise_5a,Развертывание из среды IDE>>
* <<Exercise_5b,Развертывание из консоли администратора GlassFish>>
* <<Exercise_7,Загрузка проекта решения>>

*Для работы с этим учебным курсом требуется следующее программное обеспечение и ресурсы.*

|===
|Программное обеспечение или материал |Требуемая версия 

|link:https://netbeans.org/downloads/index.html[+IDE NetBeans+] |Версия 7.2, 7.3, 7.4, 8.0, Java EE 

|link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+Комплект для разработчика на языке Java (JDK)+] |версия 7 или 8 

|GlassFish Server Open Source Edition 3.1.2.2 |4.x 
|===

*Предпосылки*

Предполагается, что читатель обладает базовыми знаниями по следующим технологиям или опытом программирования с их использованием:

* Программирование на Java
* IDE NetBeans

Перед изучением этого учебного курса можно ознакомиться со следующей документацией:

* link:http://wiki.netbeans.org/MavenBestPractices[+Испытанные приемы для Apache Maven в IDE NetBeans+]
* link:http://books.sonatype.com/mvnref-book/reference/introduction.html[+Глава 1. Введение в Apache Maven+] (фрагмент из книги link:http://books.sonatype.com/mvnref-book/reference/index.html[+Maven: The Complete Reference+])

Можно загрузить link:https://netbeans.org/projects/samples/downloads/download/Samples%252FJavaEE%252FMavenEnterpriseApp.zip[+готовый проект в виде архива ZIP+].


== Использование Maven в среде IDE

Support for Maven is fully integrated in IDE NetBeans. Разработка проекта, в котором используется платформа Maven, практически идентична случаю разработки с использованием Ant. Однако в случае Maven имеются некоторые отличия, касающиеся способа сборки проектов и работы с зависимостями. Советы, приведенные ниже, могут помочь избегнуть ряда проблем при первом создании приложения Maven.

*Проверка параметров Maven*

Если это ваш первый проект Maven, проверьте параметры настройки Maven в окне "Параметры". Maven включен в комплект IDE и устанавливается при установке среды IDE.

1. Откройте окно 'Настройки' в IDE (Сервис > Параметры; NetBeans> Предпочтения на Mac).
2. Выберите в окне "Параметры" категорию "Java" и перейдите на вкладку "Maven".
3. Подтвердите указание домашней страницы Maven.

Можно использовать версию Maven, входящую в комплект среды IDE, либо указать местоположение локальной установки Maven (требуется версия 2.0.9 или более поздняя).


[start=4]
. Для закрытия окна "Параметры" нажмите кнопку "ОК".

*Примечания.*

* Поддержка Maven автоматически включается при включении Java в среде IDE. Если нет, необходимо включить подключаемый модуль Java EE.

*Обновите репозитории Maven*

Локальные и удаленные репозитории Maven используются для автозавершения кода, а также при построении проектов. Обновление индексов удаленных репозиториев Maven требуется для обеспечения немедленной доступности всех артефактов, которые могут потребоваться при разработке проекта. Частоту проверки наличия обновлений можно настроить на вкладке "Maven" в окне "Параметры" среды IDE. Вы можете выполнить немедленную проверку обновлений и проверку локальных и удаленных репозиториев Maven в окне 'Службы'.

1. Выберите меню "Окно" > "Службы". Откроется окно "Службы".
2. Разверните узел 'Репозитории Maven' в окне 'Службы'.
3. Разверните узел репозитория для просмотра артефактов.
4. Щелкните правой кнопкой мыши узел репозитория и выберите во всплывающем меню 'Обновить индекс'.

При нажатии кнопки "Обновить индексы" в среде IDE выполняется проверка и загрузка самого свежего индекса для каждого из настроенных удаленных репозиториев Maven. Индекс представляет текущее состояние артефактов, расположенных в репозитории, и используется для предоставления ссылок на артефакты, доступных для использования в приложении. По умолчанию артефакты не загружаются из репозитория автоматически без явно обозначенной необходимости в них.

Для поиска артефактов, щелкните правой кнопкой узел мыши узел 'Репозитории Maven' в окне 'Службы' и выберите 'Найти'.

*Примечания.*

* Размер индексов довольно велик и обновление всех индексов может занять значительное время.
* Если используется IDE NetBeans 7.1 или более ранняя версия, выберите "Окно > Другие > Обозреватель репозитория Maven" и нажмите "Обновление индексов" ( image:images/maven-refreshrepo.png[title="Кнопка 'Обновить индексы'"]  ) в верхней части окна "Обзор репозитория Maven".

Дополнительные сведения об использовании Maven в IDE NetBeans см. в разделе link:https://netbeans.org/kb/docs/java/maven-hib-java-se.html#02[+Настройка Maven+] в учебном курсе link:https://netbeans.org/kb/docs/java/maven-hib-java-se.html[+Создание приложения Swing Maven с помощью Hibernate+], а также в link:http://wiki.netbeans.org/MavenBestPractices[+Испытанные приемы для Apache Maven в IDE NetBeans+].


== Создание проекта приложения уровня предприятия Maven

Цель данного упражнения заключается в создании проекта приложения уровня предприятия с использованием архетипа приложения Maven Enterprise, входящего в комплект поставки среды IDE. Архетип приложения уровня предприятия также создает проект EJB и проект webapp.

IDE включает в себя несколько архетипов Maven в мастере создания проектов, которые позволяют быстро создать типы общих проектов NetBeans, такие как проекты корпоративных приложений (EAR), проектов веб-приложений (WAR) и проектов модулей EJB (JAR). Мастер также позволяет создавать проекты из архетипов, полученных из зарегистрированных удаленных репозиториев.

1. Выберите 'Файл' > 'Создать проект' (Ctrl-Shift-N; ⌘-Shift-N в Mac) в главном меню.
2. В категории Maven выберите "Приложение Enterprise. Нажмите кнопку "Далее".

image::images/maven-newproject1.png[title="Тип проекта корпоративного приложения Maven в мастере создания проектов"]


[start=3]
. Введите *MavenEnterpriseApp* в качестве имени проекта и укажите местоположение проекта.

[start=4]
. (Необязательно) Измените подробные данные артефакта. Нажмите кнопку "Далее". 

image::images/maven-newproject2.png[title="Сведения о проекте Maven в мастере создания проектов"]


[start=5]
. В качестве сервера выберите сервер GlassFish.

[start=6]
. В качестве версии Java EE выберите Java EE 6 или Java EE 7.

[start=7]
. Установите флажки "Создать модуль EJB" и "Создать модуль веб-приложения". Нажмите кнопку "Завершить".

При нажатии кнопки "Готово" из архетипа приложения Maven Enterprise создаются следующие проекты:

* *EJB.* (MavenEnterpriseApp-ejb) Проект EJB обычно содержит исходный код с бизнес-логикой приложения. Проект EJB пакетируется в архив JAR EJB.
* *Webapp.* (MavenEnterpriseApp-web) Проект Webapp обычно содержит уровень представления приложения, такого как страницы JSF и JSP и сервлеты. В проект веб-приложения может также входить исходный код с бизнес-логикой. Проект веб-приложения пакетируется в архив WAR.
* *Сборка.* (MavenEnterpriseApp) Проект Assembly используется для сборки архива EAR из архивов EJB и WAR. Проект сборки не содержит исходных кодов.
* *Enterprise Application.* (MavenEnterpriseApp-ear) Проект Enterprise Application не содержит источников. В проекте приложения уровня предприятия содержится только файл POM ( ``pom.xml`` ) с подробными данными о модулях, входящих в приложение уровня предприятия.

image::images/maven-projectswindow2.png[title="В окне 'Проекты' отображаются созданные проекты"]

Если в созданном проекте корпоративного приложения недоступны какие-либо зависимости, этот проект будет помечен значком. Если развернуть узел "Зависимости" для проекта MavenEnterpriseApp-ear, можно проверить, все ли необходимые библиотеки присутствуют в проекте и находятся на пути класса. Проект приложения J2EE имеет зависимости от JAR и WAR, которые будут пакетированы и доступны после сборки проектов EJB и веб-приложения.  ``MavenEnterpriseApp-ejb``  и  ``MavenEnterpriseApp-web``  находятся в списке зависимостей.

В ряде случаев в строке статуса будет отображаться значок Maven. Щелкните этот значок, чтобы запустить подготовительную сборку или исправить отсутствующие зависимости.

image::images/priming-build.png[title="Значок Maven на панели состояния  позволяет запустить подготовительную сборку."] 


== Написание кода проекта EJB

Проект EJB содержит бизнес-логику приложения. Для управление транзакциями в этом проекте используется контейнер GlassFish, использующий интерфейс Java Transaction API (JTA). В этом руководстве для класса сущности в модуле EJB будет создан класс сущностей, управляемый сообщениями компонент и фасад сеанса.


=== Создание блока сохранения состояния

В этом упражнении в проекте EJB будет создан блок сохранения состояния. В блоке сохранения состояния указываются подробные данные подключения к базе данных и указывается способ управления транзакциями. Для этого приложения в мастере создания блока сохранения состояния указывается JTA, поскольку управление транзакциями должно осуществляться сервером GlassFish.

Для создания блока сохранения состояния выполните следующие действия.

1. Для открытия мастера создания файла щелкните правой кнопкой мыши узел проекта EJB и выберите пункт раскрывающегося меню "Создать > Прочее".
2. Выберите "Блок сохранения состояния" в категории "Сохранение состояния". Нажмите кнопку "Далее".
3. Выберите "EclipseLink" в качестве поставщика сохранения состояния в диалоговом окне мастера создания блока сохранения состояния.
4. Выберите источник данных (например, выберите  ``jdbc/sample`` , если необходимо использовать JavaDB).

Источник данных для  ``jdbc/sample``  находится в составе пакета среды IDE при установке среды IDE и сервера приложений GlassFish. Однако можно указать другой источник данных, если это необходимо.

Можно сохранить другие параметры по умолчанию (имя блока сохранения состояния, поставщик сохранения состояния EclipseLink).


[start=5]
. Убедитесь в том, что установлен флажок "Использовать интерфейсы API Java Translaction", и что для стратегии создания таблиц установлено значение "Создать", т.е. таблицы на основе классов сущностей создаются при развертывании приложения. Нажмите кнопку "Завершить".

image::images/maven-persistenceunit.png[title="Мастер создания блоков сохранения состояния"]

При нажатии кнопки "Готово" в среде IDE создается файл XML  ``persistence.xml`` , который открывается в редакторе. В окне 'Проекты' видно, что файл был создан в каталоге  ``Другие источники > src/main/resources > META-INF`` . В этом файле содержатся подробные данные о подключении к базе данных и об управлении транзакциями. При переходе на вкладку "Исходный код" в редакторе отобразятся следующие данные блока сохранения состояния.


[source,xml]
----

...
<persistence-unit name="com.mycompany_MavenEnterpriseApp-ejb_ejb_1.0-SNAPSHOTPU" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>jdbc/sample</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <property name="eclipselink.ddl-generation" value="create-tables"/>
    </properties>
</persistence-unit>
            
----

Нетрудно заметить, что в качестве типа транзакции указано значение  ``JTA`` , и что приложением будет использоваться зарегистрированный источник данных  ``jdbc/sample`` .


=== Создание класса сущности

Это упражнение посвящено созданию класса сущности в проекте EJB для представления объектов, состояние которых сохраняется в базе данных. Для создания класса сущности NewsEntity выполните следующие действия.

1. Щелкните правой кнопкой мыши модуль EJB в окне "Проекты" и выберите "Создать > Прочее" для открытия мастера создания файла.
2. Выберите "Класс сущностей" в категории "Сохранение состояния". Нажмите кнопку "Далее".
3. В поле "Имя класса" введите *NewsEntity*.
4. Введите *ejb* в качестве имени пакета и оставьте для параметра "Тип первичного ключа" значение по умолчанию "Long". Нажмите кнопку "Завершить".

При нажатии кнопки "Готово" класс сущности  ``NewsEntity.java``  будет открыт в редакторе исходного кода. В редакторе исходного кода добавьте несколько полей путем выполнения следующих действий.

1. Добавьте к классу следующие объявления полей.

[source,java]
----

private String title;
private String body;
----

[start=2]
. В редакторе исходного кода щелкните правой кнопкой мыши внутри определения класса и выберите "Вставка кода" (ALT+ISERT; CTRL+I на компьютере Mac) > "Методы получения и установки".

[start=3]
. В диалоговом окне "Создание методов получения и установки" выберите поля  ``body``  и  ``title`` . Нажмите кнопку "Создать".

[start=4]
. Сохраните изменения, внесенные в класс.


=== Создание управляемого сообщениями компонента

В этом упражнении в проекте EJB будет создан компонент, управляемый сообщениями. Компонент, управляемый сообщениями, – это компонент EJB, реализующий асинхронный обмен сообщениями. Управляемый сообщениями компонент используется в приложении NewsApp для получения и обработки сообщений, передаваемых в очередь сервлетом в веб-модуле.

Для использования компонента, управляемого сообщениями, в приложении необходимо зарегистрировать на сервере ресурсы подключения, используемые компонентом. При развертывании на сервере GlassFish можно создавать ресурсы непосредственно на сервере с помощью консоли администратора или создавать их во время развертывания, указав подробные данные в файле дескриптора  ``glassfish-resources.xml`` . При развертывании приложения на сервере сервер регистрируют ресурсы на основе файла дескриптора. При использовании мастера создания файлов в среде IDE для создания управляемого сообщениями компонента среда IDE сформирует элементы в файле дескриптора.

В проекте Maven файл  ``glassfish-resources.xml``  расположен в каталоге  ``src/main/setup``  в узле проекта в окне "Файлы".

1. Щелкните правой кнопкой мыши модуль EJB в окне "Проекты" и выберите "Создать > Прочее" для открытия мастера создания файла.
2. Из категории Enterprise JavaBeans выберите "Управляемый сообщениями компонент". Нажмите кнопку "Далее".
3. В поле "Имя EJB" введите *NewMessage*.
4. В раскрывающемся списке "Пакет" выберите *ejb*.
5. Для открытия диалогового окна "Добавление адресата сообщения" нажмите кнопку "Добавить" рядом с полем "Адресат проекта".
6. В диалоговом окне "Добавление адресата сообщения" введите *jms/NewMessage* и выберите "Очередь" для типа адресата. Нажмите кнопку "ОК".

image::images/maven-messagedestination.png[title="Диалоговое окно &quot;Добавление назначения сообщения&quot;."]


[start=7]
. Подтвердите, что адресат проекта выбран правильно. Нажмите кнопку "Далее".

image::images/maven-newmdb.png[title="Мастер создания компонентов, управляемых сообщениями"]


[start=8]
. В диалоговом окне "Свойства конфигурации активации" оставьте настройки по умолчанию без изменений. Нажмите кнопку "Завершить".

При нажатии кнопки "Готово" автоматически создается класс компонента, к которому добавляются следующие аннотации, идентифицирующие класс как компонент, управляемый сообщениями, а также свойства настройки.


[source,java]
----

@MessageDriven(mappedName = "jms/NewMessage", activationConfig =  {
        @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
    })
public class NewMessage implements MessageListener {

    public NewMessage() {
    }

    @Override
    public void onMessage(Message message) {
    }
}
----

[start=9]
. Введите в класс ресурс  ``MessageDrivenContext``  посредством добавления к классу следующего аннотированного поля:

[source,java]
----

public class NewMessage implements MessageListener {

*@Resource
private MessageDrivenContext mdc;*

----

[start=10]
. Введите в класс диспетчер объектов посредством добавления к классу следующего аннотированного поля (выделено полужирным шрифтом):

[source,java]
----

public class NewMessage implements MessageListener {

@Resource
private MessageDrivenContext mdc;
*@PersistenceContext(unitName="com.mycompany_MavenEnterpriseApp-ejb_ejb_1.0-SNAPSHOTPU")
private EntityManager em;*
                   
----

Аннотация  ``@PersistenceContext``  указывает контекст путем объявления блока сохранения состояния. Значение  ``unitName``  представляет собой имя блока сохранения состояния.


[start=11]
. Добавьте следующий метод  ``save``  (выделен полужирным шрифтом).

[source,java]
----

public NewMessage() {
}

@Override
public void onMessage(Message message) {
}

*private void save(Object object) {
    em.persist(object);
}*
----

[start=12]
. Измените метод  ``onMessage``  путем добавления следующих строк кода (выделены полужирным шрифтом) в тело метода:

[source,java]
----

public void onMessage(Message message) {
     *ObjectMessage msg = null;
     try {
          if (message instanceof ObjectMessage) {
          msg = (ObjectMessage) message;
              NewsEntity e = (NewsEntity) msg.getObject();
              save(e);
          }
     } catch (JMSException e) {
          e.printStackTrace();
          mdc.setRollbackOnly();
     } catch (Throwable te) {
          te.printStackTrace();
     }*
}
----

[start=13]
. Исправьте операторы импорта (Ctrl-Shift-I; ⌘-Shift-I в Mac) и сохраните изменения.

NOTE:  При создании операторов импорта необходимо убедиться, что импортируются библиотеки * ``jms`` * и * ``javax.annotation.Resource`` *.

Подробные сведения об управляемых сообщениями компонентах приведены в главе link:http://download.oracle.com/javaee/6/tutorial/doc/gipko.html[+Что такое управляемый сообщениями компонент?+] в link:http://download.oracle.com/javaee/6/tutorial/doc/index.html[+руководстве по Java EE 6. Часть I+].


=== Создание компонента сеанса

В этом упражнении будет использоваться мастер создания фасада сеанса для класса сущности NewsEntity. Мастер создаст методы  ``create`` ,  ``edit``  и  ``find`` , которые будут вызываться из сервлетов в проекте веб-приложения.

1. Щелкните модуль EJB правой кнопкой мыши и выберите команду "Создать" > "Другие".
2. Из категории "Сохранение состояния" выберите "Сеансные компоненты для классов сущностей" и нажмите кнопку "Далее".
3. Из списка доступных классов сущностей выберите *ejb.NewsEntity* и нажмите кнопку "Добавить", чтобы переместить класс на панель "Выбранные классы сущностей". Нажмите кнопку "Далее".
4. В качестве пакета выберите *ejb*. Нажмите кнопку "Завершить".

При нажатии кнопки "Готово" среда IDE создает два класса фасада сеанса:  ``AbstractFacade.java``  и  ``NewsEntityFacade.java`` , последний расширяет класс абстрактного фасада. Класс абстрактного фасада определяет несколько методов, которые обычно используются с классами сущностей.

image::images/maven-sessionwizard.png[title="Компоненты Bean сеанса для мастера классов сущностей"]


== Написание кода веб-приложения

В примере в этом разделе будет создано два сервлета в проекте веб-приложения.


=== Создание сервлета ListNews

В этом упражнении будет создан сервлет ListNews, используемый для вывода списка отправленных сообщений. Для ввода в фасад сеанса и доступа к методу  ``findAll``  и получения отправленных сообщений используются аннотации.

1. Щелкните проект веб-модуля правой кнопкой мыши и выберите "Создать" > "Сервлет".
2. В поле "Имя класса" введите *ListNews*.
3. В качестве имени пакета введите *web*. Нажмите кнопку "Завершить".

При нажатии кнопки "Готово" класс  ``ListNews.java``  будет открыт в редакторе исходного кода.


[start=4]
. Щелкните правой кнопкой мыши в редакторе исходного кода в определении класса и выберите команду "Вставка кода" (ALT+ISERT; CTRL+I на компьютере Mac) > "Вызов компонента EJB".

[start=5]
. В диалоговом окне "Вызов компонента EJB" разверните узел MavenEnterpriseApp-ejb и выберите NewsEntityFacade. Нажмите кнопку "ОК".

image::images/maven-callbean.png[title="Диалоговое окно 'Вызвать компонент корпоративного уровня'"]

При нажатии кнопки ОК выполняется ввод ресурса EJB в сервлет с использованием аннотации  ``@EJB`` .


[source,java]
----

@WebServlet(name = "ListNews", urlPatterns = {"/ListNews"})
public class ListNews extends HttpServlet {
    @EJB
    private NewsEntityFacade newsEntityFacade;
----

[start=6]
. В методе  ``processRequest``  внесите изменения, добавив следующие строки (выделены полужирным шрифтом) в тело метода:

[source,xml]
----

out.println("<h1>Servlet ListNews at " + request.getContextPath () + "</h1>");
*
List news = newsEntityFacade.findAll();
for (Iterator it = news.iterator(); it.hasNext();) {
  NewsEntity elem = (NewsEntity) it.next();
  out.println(" <b>"+elem.getTitle()+" </b><br />");
  out.println(elem.getBody()+"<br /> ");
}
out.println("<a href='PostMessage'>Add new message</a>");
*
out.println("</body>");
   
----

NOTE:  Если используется более ранняя версия IDE необходимо удалить комментарии кода.


[start=7]
. Исправьте выражения импорта (Ctrl-Shift-I; ⌘-Shift-I в Mac) и сохраните изменения.

При создании операторов импорта может потребоваться импортировать библиотеки  ``java.util`` .


=== Создание сервлета PostMessage

В этом упражнении будет создан сервлет PostMessage, используемый для отправки сообщений. Для добавления созданных ресурсов JMS непосредственно в сервлет используются аннотации с указанием имени переменной и имени, на которое она отображается. Затем необходимо написать код для отправки сообщения JMS и код для формы HTML, предназначенной для добавления сообщения.

1. Щелкните проект веб-модуля правой кнопкой мыши и выберите "Создать" > "Сервлет".
2. В поле "Имя класса" введите *PostMessage*.
3. В качестве имени пакета выберите *web*. Нажмите кнопку "Завершить".

При нажатии кнопки "Готово" в редакторе исходного кода будет открыт класс  ``PostMessage.java`` .


[start=4]
. Используйте аннотации в редакторе исходного кода для ввода ресурсов  ``ConnectionFactory``  и  ``Queue``  путем добавления следующих объявлений полей.

[source,java]
----

@WebServlet(name="PostMessage", urlPatterns={"/PostMessage"})
public class PostMessage extends HttpServlet {
   *@Resource(mappedName="jms/NewMessageFactory")
   private  ConnectionFactory connectionFactory;

   @Resource(mappedName="jms/NewMessage")
   private  Queue queue;*
----

[start=5]
. Для импорта библиотек * ``javax.jms`` * исправьте параметры импорта.

image::images/maven-searchdepend1.png[title="Диалоговое окно 'Исправить все выражения импорта'"]

NOTE:  Если IDE не поддерживает  ``javax.jms``  как параметр, можно выполнить поиск в репозиториях правильного артефакта, щелкнув значок рекомендации на поле рядом с  ``private ConnectionFactory connectionFactory;``  и выбрав 'Поиск зависимостей' в репозиториях Maven.

image::images/maven-searchdependencies.png[title="Подсказки в редакторе для поиска в репозиториях зависимостей"]

Для поиска артефакта  ``javaee-api-6.0`` , содержащего  ``ConnectionFactory``  можно воспользоваться диалоговым окном "Поиск в репозиториях Maven".

image::images/maven-searchdepend2.png[title="Диалоговое окно 'Поиск в репозиториях Maven'"]


[start=6]
. Добавьте следующие строки, используемые для отправки сообщений JMS, к методу  ``processRequest`` .

[source,java]
----

response.setContentType("text/html;charset=UTF-8");

*// Add the following code to send the JMS message
String title=request.getParameter("title");
String body=request.getParameter("body");
if ((title!=null) &amp;&amp; (body!=null)) {
    try {
        Connection connection = connectionFactory.createConnection();
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        MessageProducer messageProducer = session.createProducer(queue);

        ObjectMessage message = session.createObjectMessage();
        // here we create NewsEntity, that will be sent in JMS message
        NewsEntity e = new NewsEntity();
        e.setTitle(title);
        e.setBody(body);

        message.setObject(e);
        messageProducer.send(message);
        messageProducer.close();
        connection.close();
        response.sendRedirect("ListNews");

    } catch (JMSException ex) {
        ex.printStackTrace();
    }
}*
----

[start=7]
. Добавьте следующие строки, используемые для отправки сообщений (выделены жирным шрифтом) к веб-форме.

[source,xml]
----

out.println("Servlet PostMessage at " + request.getContextPath() + "</h1>");

*// The following code adds the form to the web page
out.println("<form>");
out.println("Title: <input type='text' name='title'><br/>");
out.println("Message: <textarea name='body'></textarea><br/>");
out.println("<input type='submit'><br/>");
out.println("</form>");
*
out.println("</body>");
    
----

NOTE:  Если используется более ранняя версия IDE необходимо удалить комментарии кода.


[start=8]
. Исправьте операторы импорта и сохраните измененные данные.

image::images/maven-jms-imports.png[title="Диалоговое окно 'Исправить все выражения импорта'"]

NOTE:  Необходимо выполнить импорт библиотек * ``javax.jms`` * для  ``Connection`` ,  ``ConnectionFactory`` ,  ``Session``  и  ``Queue`` .


== Сборка приложения с помощью Maven

Написание кода завершено, и можно выполнить сборку приложения уровня предприятия с помощью Maven. Этот раздел посвящен сборке и пакетированию проектов в архив EAR. В архив EAR входят архив EJB JAR и архив WAR. После создания архива EAR его можно развернуть на целевом сервере.


=== Работа с зависимостями проекта

В этом упражнении вы исследуете POM ( ``pom.xml`` ) веб-проекта и измените POM, чтобы избежать включения ненужных артефактов в WAR при пакетировании.  В каждый проект Maven входит файл  ``pom.xml`` , содержащий подробные данные о содержимом архивов. Все внешние библиотеки, запрашиваемые проектом, внесены в качестве зависимостей в файл POM. Файл POM можно изменить, указав зависимости, которые необходимо включить или исключить при пакетировании архива.

В этом приложении в архив EAR пакетируются архивы JAR EJB и WAR. Обратите внимание на файл  ``pom.xml``  в проекте MavenEnterpriseApp-ear: архивы EJB и WAR объявлены как зависимости.

image::images/maven-earpom.png[title="pom.xml проекта EAR"]

Обратите внимание на файл  ``pom.xml``  в проекте веб-приложения: архив EJB объявлен как зависимость, и для области выбрано значение  ``указана`` . В случае когда значение элемента области артефакта  ``указано`` , артефакт не будет включен при пакетировании. Архив·EJB·требуется·проектом·веб-приложения·как·зависимость,·однако·для·этого·приложения·не·требуется·включать·архив·EJB·в·WAR·при·пакетировании,·так·как·архив EJB предоставляется для использования в веб-приложении в составе архива EAR.

image::images/maven-webpom.png[title="pom.xml проекта веб-приложения"]

Можно открыть файл  ``pom.xml``  в редакторе и просмотреть визуальное представление зависимостей проекта на вкладке "График". Если используется более ранняя версия IDE, можно щелкнуть открытый в редакторе файл  ``pom.xml``  правой кнопкой мыши и выбрать "Показать график зависимостей". Наведите указатель мыши на артефакт для отображения всплывающей подсказки с подробными данными артефакта.

image::images/maven-webpomgraph.png[title="График зависимостей."]

Выполните следующие действия для изменения файла POM проекта веб-приложения и добавьте элемент  ``scope``  scope к зависимости в артефакте  ``javaee-api`` .

1. Разверните узел "Файлы проекта" для проекта веб-приложения.
2. Дважды щелкните  ``pom.xml``  для открытия файла в редакторе.
3. Убедитесь, что в артефакте  ``javaee-api``  для параметра  ``<scope>``  задано значение  ``provided`` .

Если задано любое другое значение, кроме  ``provided`` , необходимо внести следующие изменения в POM:


[source,xml]
----

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>7.0</version>
    <type>jar</type>
    *<scope>provided</scope>*
</dependency>
----

Можно использовать автозавершение кода в редакторе POM, упрощающее правку файла.

image::images/maven-addscope-javaee.png[title="автозавершение кода для элемента области в POM"]

Если в файле POM содержится объявление предоставленной зависимости, этот артефакт не пакетируется Maven при сборке архива WAR.


[start=4]
. Сохраните изменения.


=== Сборка проекта с зависимостями

Платформа сборки Maven проходит через определенную последовательность этапов, и каждый этап подразумевает выполнение одной или нескольких задач, причем можно настроить использование различных подключаемых модулей Maven. Пункт меню "Сборка вместе с зависимостями" соответствует этапу  ``install``  жизненного цикла сборки Maven, и для него настроено использование подключаемого модуля Reactor. При выборе пункта раскрывающегося меню "Сборка вместе с зависимостями" Maven выполняет сборку приложения и всех необходимых зависимостей, после чего артефакты сборки копируются в локальный репозиторий.

Можно настроить привязку целей к операциям в меню "Действия" в диалоговом окне "Свойства" проекта.

Для сборки архива EAR выполните следующее действие.

* Щелкните правой кнопкой мыши узел проекта MavenEnterpriseApp-ear и выберите команду "Сборка вместе с зависимостями".

При сборке проекта EAR с использование подключаемого модуля Reactor сборка зависимостей подпроектов выполняется перед сборкой проекта EAR. В окне "Вывод" отображается порядок сборки.

image::images/maven-reactor1.png[title="В окне &quot;Вывод&quot; отображается порядок сборки Reactor."]

Результаты сборки также отображаются в окне "Вывод".

image::images/maven-reactor2.png[title="В окне &quot;Вывод&quot; отображается состояние сборки Reactor"]

После сборки проекта EAR итоговый архив EAR отображается в каталоге  ``target``  в узле проекта EAR в окне "Файлы".

image::images/maven-earfileswindow1.png[title="Окно 'Файлы', в котором отображается архив EAR"]

Если использовано имя артефакта по умолчанию  ``com.mycompany`` , для просмотра артефактов сборки в браузере репозиториев Maven можно развернуть узел  ``com.mycompany``  в локальном репозитории.

Подробные сведения о сборке проектов Maven приведены в документе link:http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html[+Maven - Введение в жизненный цикл сборки+] по адресу link:http://maven.apache.org[+maven.apache.org+].


== Развертывание и выполнение приложения

В этом разделе описываются два метода развертывания архива EAR на сервере. Приложение можно развернуть на сервере GlassFish с помощью действия меню в среде IDE или с помощью средства развертывания в консоли администратора GlassFish.


=== Развертывание и выполнение приложения из среды IDE

В этом упражнении мы используем действие "Выполнить" для развертывания архива EAR на сервере GlassFish. После развертывания будет необходимо открыть страницу ListNews приложения в браузере и добавить сообщение.

1. Щелкните правой кнопкой мыши узел проекта EAR в окне "Проекты" и выберите "Выполнение".

При нажатии команды "Выполнение" среда IDE разворачивает архив EAR и создает ресурсы JMS на сервере. Среда IDE откроет установленную по умолчанию начальную страницу приложения (link:http://localhost:8080/MavenEnterpriseApp-web/[+http://localhost:8080/MavenEnterpriseApp-web/+]) в браузере.


[start=2]
. Для вывода страницы ListNews откройте в браузере следующий адрес URL.

link:http://localhost:8080/MavenEnterpriseApp-web/ListNews[+http://localhost:8080/MavenEnterpriseApp-web/ListNews+].

При первом выполнении проекта база данных пуста, и сообщения для вывода отсутствуют.

image::images/maven-browser1.png[title="Страница ListNews открыта в браузере"]


[start=3]
. Нажмите кнопку "Добавить сообщение".

[start=4]
. Введите сообщение в форму в сервлете PostMessage. Нажмите кнопку "Отправить запрос".

image::images/maven-browser2.png[title="Страница PostMessage открыта в браузере"]

При добавлении сообщения с помощью сервлета PostMessage оно передается на постоянное хранение в управляемый сообщениями компонент. Для просмотра сообщений в базе данных вызывается сервлет ListNews. Список сообщений в базе данных, извлеченных сервлетом ListNews, часто выводится без нового сообщения, поскольку служба передачи сообщений работает асинхронно.

В проектах Maven, использующих сервер GlassFish в качестве целевого сервера, функции "Компиляция при сохранении" и "Развертывание при сохранении" включены по умолчанию. Например, при изменении и сохранении сервлета можно перезагрузить сервлет в браузере и просмотреть изменения без повторного развертывания приложения.


=== Развертывание из консоли администратора GlassFish

В этом упражнении выполняется развертывание архива EAR с помощью средства "Развернуть" в консоли администратора Glassfish.

1. Разверните узел "Серверы" в окне "Службы".
2. Запустите сервер приложений GlassFish.
3. Щелкните правой кнопкой мыши узел сервера приложений GlassFish и выберите "Просмотр консоли администратора" для открытия в браузере консоли администратора GlassFish.
4. Щелкните узел "Приложения" на левой панели консоли администратора.
5. Нажмите кнопку "Развернуть" на главной панели консоли администратора.
6. Нажмите кнопку "Обзор" для поиска архива EAR приложения уровня предприятия.

Архив EAR расположен в каталоге  ``target``  внутри каталога приложения уровня предприятия в локальной системе.


[start=7]
. Нажмите кнопку "ОК".

При нажатии кнопки "ОК" выполняется развертывание приложения с помощью средства развертывания GlassFish.

NOTE:  При развертывании приложения с помощью средства развертывания на консоли администрирования GlassFish, также необходимо вручную создать ресурсы, необходимые для приложения, если они не существуют.


== Загрузка проекта решения

Решение для данного учебного курса в виде проекта можно загрузить несколькими способами.

* Загрузите link:https://netbeans.org/projects/samples/downloads/download/Samples%252FJavaEE%252FMavenEnterpriseApp.zip[+архив завершенного проекта в формате zip+].
* Выполните проверку исходных файлов проекта на выходе из примеров NetBeans, выполнив перечисленные ниже действия.
1. Выберите в главном меню "Группа > Subversion > Проверить".
2. В диалоговом окне "Проверка" введите следующий URL-адрес репозитория:
 ``https://svn.netbeans.org/svn/samples~samples-source-code`` 
Нажмите кнопку "Далее".

[start=3]
. Нажмите кнопку "Обзор" для открытия диалогового окна "Обзор папок репозитория".

[start=4]
. Разверните корневой узел и выберите *samples/javaee/MavenEnterpriseApp*. Нажмите кнопку "ОК".

[start=5]
. Укажите локальную папку для исходных файлов (папка должна быть пустой).

[start=6]
. Нажмите кнопку "Завершить".

После нажатия кнопки "Готово" среда IDE инициализирует локальную папку в качестве репозитория Subversion и выполняет проверку исходных файлов проекта на выходе.


[start=7]
. Щелкните команду "Открыть проект" в диалоговом окне, которое появится после завершения проверки.

*Примечания.* For more about installing Subversion, see the section on link:../ide/subversion.html#settingUp[+Setting up Subversion+] in the link:../ide/subversion.html[+Guide to Subversion in IDE NetBeans+].


link:/about/contact_form.html?to=3&subject=Feedback:%20Creating%20an%20Enterprise%20Application%20Using%20Maven[+Отправить отзыв по этому учебному курсу+]



== Дополнительные сведения

For more information about using IDE NetBeans to develop Java EE applications, see the following resources:

* link:javaee-intro.html[+Введение в технологию Java EE +]
* link:javaee-gettingstarted.html[+Начало работы с приложениями Java EE+]
* link:maven-entapp-testing.html[+Тестирование приложения Maven уровня предприятия+]
* link:../../trails/java-ee.html[+Учебная карта по Java EE и Java Web+]

Дополнительные сведения по использованию компонентов уровня предприятия приведены в link:http://download.oracle.com/javaee/7/tutorial/doc/[+учебном курсе по Java EE 7+].

To send comments and suggestions, get support, and keep informed on the latest developments on the IDE NetBeans Java EE development features, link:../../../community/lists/top.html[+join the nbj2ee mailing list+].

