| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> |
| <!-- |
| Copyright (c) 2009, 2011, 2014, Oracle and/or its affiliates. All rights reserved. |
| --> |
| |
| <html> |
| <head> |
| <title>Using CDI to Inject OSGi Bundles as Services in IDE NetBeans</title> |
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" > |
| <meta name="description" content="A tutorial on how to use NetBeans IDE and Maven to create an OSGi bundle that is accessed from a web application using CDI."> |
| <link rel="stylesheet" href="../../../netbeans.css"> |
| <meta name="author" content="ken ganfield"> |
| </head> |
| <body> |
| <h1>Using CDI to Inject OSGi Bundles as Services in IDE NetBeans</h1> |
| |
| |
| <p>This document demonstrates how the integrated support for the <a href="http://www.osgi.org/Main/HomePage">Open Services Gateway Initiative</a> (OSGi) framework in IDE NetBeans simplifies the process of creating OSGi bundles and using the bundles in your projects. В этом учебном курсе будут созданы два простых пакета OSGi из архетипа пакета OSGi Maven, затем они будут развернуты на сервере GlassFish Server Open Source Edition 3.1. |
| </p> |
| |
| <p>После создания основных пакетов OSGi будет создано клиентское веб-приложение, а CDI использован для внедрения пакетов как служб. Затем веб-приложение будет развёрнуто как пакет на сервере. Далее в этом учебном курсе показано использование консоли администрирования OSGi для работы с пакетами OSGi.</p> |
| |
| <p>Применение пакета OSGi в приложении уровня предприятия позволяет увеличить модульность и гибкость по отношению к обновлению отдельных пакетов. Встроенная поддержка OSGi в сервере GlassFish делает внедрение пакетов в приложение очень простым.</p> |
| |
| <p class="notes">Этот учебный курс основан на записи в блоге <a href="http://blogs.oracle.com/arungupta/entry/totd_154_dynamic_osgi_services" target="_blank"> TOTD #154: Dynamic OSGi services in GlassFish 3.1 - Using CDI and @OSGiService </a> и других записях, которые можно найти в <a href="http://blog.arungupta.me/" target="_blank">блоге Аруна Гупты</a>. Блог также содержит много других интересных записей о работе с OSGi.</p> |
| |
| <p>Кроме того, следующие ресурсы содержат массу информации об использовании OSGi и CDI в гибридных приложениях.</p> |
| |
| <ul> |
| <li><a href="http://weblogs.java.net/blog/2009/06/14/developing-hybrid-osgi-java-ee-applications-glassfish"> Разработка гибридных (OSGi + Java EE) приложений в GlassFish</a></li> |
| <li><a href="http://blogs.oracle.com/sivakumart/entry/typesafe_injection_of_dynamic_osgi"> Корректное по отношению к типам внедрение динамических служб OSGi в гибридных приложениях Java EE </a> |
| <li><a href="http://weblogs.java.net/blog/2009/06/04/osgi-enabled-web-applications-inglassfish">Веб-приложения с использованием OSGi в GlassFish</a></li> |
| <li><a href="http://www.youtube.com/watch?v=vaOpJJ-Xm70"> Видео на YouTube: корректное по отношению к типам внедрение динамических служб OSGi при помощи GlassFish 3.1 и CDI</a></li> |
| <li><a href="http://glassfish.java.net/public/GF-OSGi-Features.pdf"> Разработка приложений OSGi с помощью GlassFish Server"</a></li> |
| </ul> |
| |
| <p><b>Упражнения по темам руководства</b></p> |
| <img alt="Содержимое на этой странице применимо к IDE NetBeans 7.2, 7.3, 7.4 и 8.0" class="stamp" src="../../../images_www/articles/73/netbeans-stamp-80-74-73.png" title="Содержимое этой страницы применимо к IDE NetBeans 7.2, 7.3, 7.4 и 8.0"> |
| |
| <ul> |
| <li><a href="#Exercise_1">Создание родительского проекта POM</a></li> |
| <li><a href="#Exercise_2">Создание пакетных проектов OSGi</a> |
| <ul> |
| <li><a href="#Exercise_2a">Создание пакета интерфейса MavenHelloServiceApi</a></li> |
| <li><a href="#Exercise_2b">Создание пакета внедрения MavenHelloServiceImpl </a></li> |
| <li><a href="#Exercise_2c">Построение и развертывание пакетов OSGi</a></li> |
| </ul> |
| </li> |
| <li><a href="#Exercise_3">Создание клиентского веб-приложения</a> |
| <ul> |
| <li><a href="#Exercise_3a">Настройка зависимостей в проекте POM</a></li> |
| <li><a href="#Exercise_3b">Создание приложения MavenHelloWebClient Web</a></li> |
| <li><a href="#Exercise_3c">Построение веб-приложения как пакета</a></li> |
| <li><a href="#Exercise_3d">Развертывание пакета веб-приложения</a></li> |
| </ul> |
| </li> |
| <li><a href="#Exercise_4">Установка и использования консоли администрирования OSGi</a></li> |
| <li><a href="#Exercise_5">Ссылки и дополнительные сведения</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/7.1/beta/">IDE NetBeans</a></td> |
| <td class="tbltd1">Версия 7.2, 7.3, 7.4, 8.0, Java EE</td> |
| </tr> |
| <tr> |
| <td class="tbltd1"><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">Комплект для разработчика на языке Java (JDK)</a></td> |
| <td class="tbltd1">версия 7 или 8</td> |
| </tr> |
| <tr> |
| <td class="tbltd1">GlassFish Server Open Source Edition 3.1.2.2</td> |
| <td class="tbltd1">3.1.x или 4.x</td> |
| </tr> |
| </tbody> |
| </table> |
| <p><b>Предпосылки</b></p> |
| <p>Предполагается, что читатель обладает базовыми знаниями по следующим технологиям или опытом программирования с их использованием:</p> |
| <ul> |
| <li>Программирование на Java</li> |
| <li>IDE NetBeans</li> |
| <li>Платформа Maven</li> |
| </ul> |
| |
| <p>Перед изучением этого учебного курса можно ознакомиться со следующей документацией:</p> |
| <ul> |
| <li><a href="http://wiki.netbeans.org/MavenBestPractices" target="_blank">Испытанные приемы для Apache Maven в IDE NetBeans</a></li> |
| <li><a href="http://books.sonatype.com/mvnref-book/reference/introduction.html" target="_blank">Глава 1. Введение в Apache Maven</a> (из книги <a href="http://books.sonatype.com/mvnref-book/reference/index.html" target="_blank">Maven: The Complete Reference </a>)</li> |
| <li><a href="http://www.osgi.org/javadoc/r4v42/" target="_blank">Платформа OSGi</a></li> |
| </ul> |
| |
| |
| <a name="intro"></a> |
| <!-- ===================================================================================== --> |
| |
| |
| |
| |
| |
| |
| |
| <!-- ===================================================================================== --> |
| <!-- Creating the POM Project --> |
| <!-- ===================================================================================== --> |
| <a name="Exercise_1"></a> |
| <h2>Создание родительского проекта POM</h2> |
| <p>В этом разделе создается родительский проект POM для пакетов OSGi, которые создаются в данном учебном курсе. Файл POM проекта (<tt>pom.xml</tt>) изменяется для добавления элементов управления зависимостями, которые будут наследоваться дочерними проектами как зависимости.</p> |
| <!-- In this exercise you will modify the project POM to specify the repository that contains |
| some of the artifacts that you will use later.--> |
| <ol> |
| <li>Выберите 'Создать проект' (Ctrl-Shift-N; ⌘-Shift-N в Mac) в главном меню.</li> |
| <li>Выберите в категории "Maven" проект POM.<br> <img alt="моментальный снимок мастера создания проектов" class="margin-around b-all" src="../../../images_www/articles/72/javaee/osgi-cdi/cdi-newpomproject.png" title="Архетип проекта Maven POM в мастере создания проектов"></li> |
| |
| <li>Введите <strong>MavenOSGiCDIProject</strong> в поле имени проекта. Нажмите кнопку "Завершить". |
| <p>После нажатия кнопки "Готово" среда IDE создает проект POM и открывает проект в окне "Проекты".</p> |
| </li> |
| |
| <li>Разверните узел "Файлы проекта" в окне проектов и дважды щелкните файл <tt>pom.xml</tt>, чтобы открыть файл в редакторе. |
| <p>Базовый файл POM для проекта должен быть аналогичен следующему.</p> |
| <pre class="examplecode"> |
| <?xml version="1.0" encoding="UTF-8"?> |
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
| <modelVersion>4.0.0</modelVersion> |
| <groupId>com.mycompany</groupId> |
| <artifactId>MavenOSGiCDIProject</artifactId> |
| <version>1.0-SNAPSHOT</version> |
| <packaging>pom</packaging> |
| <properties> |
| <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
| </properties> |
| </project> |
| </pre> |
| </li> |
| <li>Измените родительский файл <tt>pom.xml</tt>, добавив следующие элементы. Сохраните изменения. |
| <pre class="examplecode"> |
| <?xml version="1.0" encoding="UTF-8"?> |
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
| <modelVersion>4.0.0</modelVersion> |
| <groupId>com.mycompany</groupId> |
| <artifactId>MavenOSGiCDIProject</artifactId> |
| <version>1.0-SNAPSHOT</version> |
| <packaging>pom</packaging> |
| <properties> |
| <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
| </properties> |
| |
| <strong><dependencyManagement> |
| <dependencies> |
| <dependency> |
| <groupId>org.osgi</groupId> |
| <artifactId>org.osgi.core</artifactId> |
| <version>4.2.0</version> |
| <scope>provided</scope> |
| </dependency> |
| </dependencies> |
| </dependencyManagement></strong> |
| </project> |
| </pre> |
| </li> |
| </ol> |
| |
| <p>В этом упражнении был явно указан артефакт, используемый в этом проекте, и его версия. Используя управление зависимостями и указывая артефакты в родительском файле POM, можно сделать файлы POM в дочерних проектах проще и обеспечить соответствие версий зависимостей в проекте.</p> |
| |
| <p>Дополнительные сведения об использовании управления зависимостями приведены в документе <a href="http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html"> Введении в механизм зависимостей</a>.</p> |
| |
| |
| |
| |
| |
| <!-- ===================================================================================== --> |
| <!-- Creating the OSGi Bundles --> |
| <!-- ===================================================================================== --> |
| <a name="Exercise_2"></a> |
| <h2>Создание пакетных проектов OSGi</h2> |
| <p>Категория Maven в мастере создания проекта содержит архетип пакета OSGi для создания проектов пакетов OSGi. При создании проекта пакета OSGi в создаваемом файле POM архив JAR <tt>org.osgi.core</tt> объявляется зависимостью, и для сборки проекта выбирается подключаемый модуль <tt>maven-bundle-plugin</tt>.</p> |
| |
| |
| |
| |
| |
| <div class="indent"> |
| |
| <!-- ===================================================================================== --> |
| <!-- Creating the API bundle --> |
| <!-- ===================================================================================== --> |
| <a name="Exercise_2a"></a> |
| <h3>Создание пакета интерфейса MavenHelloServiceApi</h3> |
| <p>В этом упражнении используется мастер создания проекта для создания пакетного проекта OSGi, который даст простой интерфейс, реализуемый другими пакетами. После создания пакета и интерфейса файл POM исправляется для обновления зависимости от артефакта <tt>org.osgi.core</tt>, указанного в родительском проекте файла POM. |
| </p> |
| |
| <ol> |
| <li>Выберите в меню "Файл" пункт "Новый проект", чтобы открыть мастер создания проекта.</li> |
| <li>Выберите пакет OSGi из категории Maven. Нажмите кнопку "Далее".<br> <img alt="моментальный снимок мастера создания проектов" class="margin-around b-all" src="../../../images_www/articles/80/javaee/osgi-cdi/cdi-new-osgiproject.png" title="Архетип набора Maven OSGi в мастере создания проектов"></li> |
| <li>Введите в поле имени проекта <strong>MavenHelloServiceApi</strong>.</li> |
| <li>Нажмите кнопку "Обзор" и выберите в качестве расположения проект POM <strong>MavenOSGiCDIProject</strong>. Нажмите кнопку "Завершить". |
| <p>После нажатия кнопки "Готово" среда IDE создает проект и открывает его в окне проектов. Если открыть <tt>pom.xml</tt> для проекта MavenHelloServiceApi в редакторе, то вы увидите, что элемент <tt>packaging</tt> определяет <tt>bundle</tt>, и что <tt>maven-bundle-plugin</tt> будет использоваться при сборке пакета.</p> |
| <pre class="examplecode"><project> |
| <modelVersion>4.0.0</modelVersion> |
| <parent> |
| <artifactId>MavenOSGiCDIProject</artifactId> |
| <groupId>com.mycompany</groupId> |
| <version>1.0-SNAPSHOT</version> |
| </parent> |
| |
| <groupId>com.mycompany</groupId> |
| <artifactId>MavenHelloServiceApi</artifactId> |
| <version>1.0-SNAPSHOT</version> |
| <strong><packaging>bundle</packaging></strong> |
| <name>MavenHelloServiceApi OSGi Bundle</name> |
| |
| <properties> |
| <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
| </properties> |
| |
| <dependencies> |
| <dependency> |
| <groupId>org.osgi</groupId> |
| <artifactId>org.osgi.core</artifactId> |
| <version>4.3.0</version> |
| <scope>provided</scope> |
| </dependency> |
| </dependencies> |
| |
| <build> |
| <plugins> |
| <plugin> |
| <groupId>org.apache.felix</groupId> |
| <strong><artifactId>maven-bundle-plugin</artifactId></strong> |
| <version>2.3.7</version> |
| <extensions>true</extensions> |
| <configuration> |
| <instructions> |
| <Bundle-Activator>com.mycompany.mavenhelloserviceimpl.Activator</Bundle-Activator> |
| <Export-Package /> |
| </instructions> |
| </configuration> |
| </plugin> |
| |
| ... |
| </plugins> |
| </build> |
| |
| ... |
| <project></pre> |
| <p>Также можно увидеть, что при создании проекта пакета OSGi с использованием архетипа пакета Maven OSGi среда IDE добавляет артефакт <tt>org.osgi.core</tt> в качестве зависимости по умолчанию.</p> |
| </li> |
| <li>Щелкните правой кнопкой мыши узел проекта MavenHelloServiceApi в окне проектов и выберите пункт "Свойства".</li> |
| <li>Выберите в диалоговом окне "Свойства проекта" категорию "Исходные файлы".</li> |
| <li>Укажите для параметра <strong>Формат исходных/двоичных файлов</strong> значение 1.6 и подтвердите, что <strong>кодировка</strong> — UTF-8. Нажмите кнопку "ОК".</li> |
| <li>Щелкните правой кнопкой мыши узел "Исходные пакеты" в окне проектов и выберите пункт "Создать" > "Интерфейс Java".</li> |
| <li>Введите в поле "Имя класса <strong>Hello</strong>.</li> |
| <li>Выберите пакет <strong>com.mycompany.mavenhelloserviceapi</strong>. Нажмите кнопку "Завершить".</li> |
| <li>Добавьте следующий метод <tt>sayHello</tt> к интерфейсу (выделено жирным) и сохраните изменения. |
| <pre class="examplecode"> |
| public interface Hello { |
| <strong>String sayHello(String name);</strong> |
| }</pre> |
| </li> |
| |
| <li>Щелкните правой кнопкой мыши узел проекта в окне проектов и выберите "Сборка". |
| <p>После сборки проекта, если открыть окно "Файлы" и развернуть узел проекта, вы увидите, что файл <tt>MavenHelloServiceApi-1.0-SNAPSHOT.jar</tt> создан в папке <tt>target</tt>.</p> |
| |
| <img alt="снимок проекта в окне 'Файлы'" class="margin-around b-all" src="../../../images_www/articles/80/javaee/osgi-cdi/cdi-manifest.png" title="просмотреть содержимое скомпилированного файла JAR в окне 'Файлы'" /> |
| |
| |
| |
| <p>Подключаемый модуль <tt>maven-bundle-plugin</tt> обрабатывает создание файла <tt>MANIFEST.MF</tt> при сборке проекта. Если открыть файл <tt>MANIFEST.MF</tt> в скомпилированном файле JAR, можно увидеть, что модуль создал заголовок манифеста, который объявляет экспортные пакеты. Для OSGi все пакеты, которые нужно предоставить и сделать доступными для других пакетов, должны быть перечислены в элементе <tt>Export-Package</tt> в файле <tt>MANIFEST.MF</tt>. </p></li> |
| <li>Убедитесь, что файл <tt>MANIFEST.MF</tt> содержит элемент <tt>Export-Package</tt> (в приведенном ниже примере этот элемент выделен <strong>жирным шрифтом</strong>). |
| |
| <pre class="examplecode"> |
| Manifest-Version: 1.0 |
| Bnd-LastModified: 1395049732676 |
| Build-Jdk: 1.7.0_45 |
| Built-By: nb |
| Bundle-Activator: com.mycompany.mavenhelloserviceapi.Activator |
| Bundle-ManifestVersion: 2 |
| Bundle-Name: MavenHelloServiceApi OSGi Bundle |
| Bundle-SymbolicName: com.mycompany.MavenHelloServiceApi |
| Bundle-Version: 1.0.0.SNAPSHOT |
| Created-By: Apache Maven Bundle Plugin |
| <strong>Export-Package: com.mycompany.mavenhelloserviceapi;uses:="org.osgi.frame |
| work";version="1.0.0.SNAPSHOT"</strong> |
| Import-Package: org.osgi.framework;version="[1.6,2)" |
| Tool: Bnd-1.50.0</pre> |
| |
| <p>Контейнер OSGi считывает заголовок манифеста <tt>Export-Package</tt> для определения доступных извне классов пакета. Например, в этом примере предоставляются классы пакета <tt>com.mycompany.mavenhelloserviceapi</tt>.</p> |
| |
| <p class="notes"><strong>Примечание.</strong> Если в файле <tt>MANIFEST.MF</tt> отсутствует элемент <tt>Export-Package</tt>, необходимо разрешить поведение по умолчанию для подключаемого модуля в окне 'Свойства проекта' и выполнить построение проекта повторно. В диалоговом окне 'Свойства проекта' выберите категорию 'Экспорт пакетов', затем выберите параметр <strong>Поведение подключаемого модуля maven-bundle-plugin по умолчанию</strong>. На панели 'Экспорт пакетов' в окне 'Свойства проекта' можно явно указать предоставляемые пакеты. Также можно указать пакеты непосредственно в файле <tt>pom.xml</tt>.</p> |
| </li> |
| </ol> |
| <!-- ===================================================================================== --> |
| <!-- Creating the Impl bundle --> |
| <!-- ===================================================================================== --> |
| <a name="Exercise_2b"></a> |
| <h3>Создание пакета реализации MavenHelloServiceImpl </h3> |
| <p>В этом упражнении будет создан MavenHelloServiceImpl в проекте POM.</p> |
| <ol> |
| <li>Выберите в меню "Файл" пункт "Новый проект", чтобы открыть мастер создания проекта.</li> |
| <li>Выберите пакет OSGi из категории Maven. Нажмите кнопку "Далее".</li> |
| <li>Введите строку <strong>MavenHelloServiceImpl</strong> в качестве имени проекта.</li> |
| <li>Нажмите кнопку "Обзор" и выберите в качестве расположения проект POM <strong>MavenOSGiCDIProject</strong> (если оно еще не выбрано). Нажмите кнопку "Завершить".</li> |
| <li>Щелкните правой кнопкой мыши узел проекта в окне "Проекты" и выберите команду "Свойства".</li> |
| <li>Выберите в диалоговом окне "Свойства проекта" категорию "Исходные файлы".</li> |
| <li>Укажите для параметра <strong>Формат исходных/двоичных файлов</strong> значение 1.6 и подтвердите, что <strong>кодировка</strong> — UTF-8. Нажмите кнопку "ОК".</li> |
| <li>Щелкните правой кнопкой мыши узел "Исходные пакеты" в окне "Проекты" и выберите пункт "Создать" > "Класс Java".</li> |
| <li>Введите значение <strong>HelloImpl</strong> в поле имени класса.</li> |
| <li>Выберите пункт <strong>com.mycompany.mavenhelloserviceimpl</strong> в поле "Пакет". Нажмите кнопку "Завершить".</li> |
| <li>Введите следующее (жирным шрифтом) и сохраните изменения. |
| <pre class="examplecode"> |
| public class HelloImpl <strong>implements Hello { |
| |
| public String sayHello(String name) { |
| return "Hello " + name;</strong> |
| } |
| }</pre> |
| |
| <p>При внедрении <tt>Hello</tt> среда IDE отобразит ошибку, которую необходимо разрешить добавлением проекта MavenHelloServiceApi в качестве зависимости.</p> |
| </li> |
| <li>Щелкните правой кнопкой мыши узел "Зависимости" в <strong>MavenHelloServiceImpl</strong> в окне проектов и выберите пункт "Добавить зависимость".</li> |
| <li>Щелкните вкладку "Открытые проекты" в диалоговом окне "Добавить библиотеку".</li> |
| <li>Выберите пакет OSGi MavenHelloServiceApi. Нажмите кнопку "Add".<br> <img alt="снимок диалогового окна 'Добавить библиотеку'" class="margin-around b-all" src="../../../images_www/articles/80/javaee/osgi-cdi/cdi-add-dependency.png" title="Откройте вкладку &quot;Проекты&quot; в диалоговом окне &quot;Добавить библиотеку&quot;."> |
| </li> |
| <li>Щелкните правой кнопкой мыши класс <tt>HelloImpl.java</tt>, открытый в редакторе и выберите 'Исправить выражения импорта' (Alt-Shift-I; ⌘-Shift-I в Mac), чтобы добавить оператор импорта для <tt>com.mycompany.mavenhelloserviceapi.Hello</tt>. Сохраните изменения.</li> |
| <li>Разверните пакет <tt>com.mycompany.mavenhelloserviceimpl</tt> и дважды щелкните <tt>Activator.java</tt> для открытия файла в редакторе.<br> <img alt="снимок окна 'Проекты'" class="margin-around b-all" src="../../../images_www/articles/80/javaee/osgi-cdi/cdi-activator.png" title="Класс 'Активатор' в окне 'Проекты'."> |
| <p>Среда IDE автоматически создала класс активатора пакета <tt>Activator.java</tt> в вашем проекте. Активатор пакета используется для управления жизненным циклом пакета. Класс активатора пакета объявляется в файле <tt>MANIFEST.MF</tt> пакета и создается при запуске пакета контейнером.</p> |
| |
| <p>Класс активатора не является обязательным для пакета OSGi, но метод <tt>start()</tt> в классе активатора можно использовать, например, для инициализации служб или других нужных пакету ресурсов. В этом упражнении будут добавлены несколько строк кода в класс, который будет выводить сообщения в "Окно вывода". Это позволит определить, когда пакет запускается и останавливается.</p> |
| </li> |
| <li>Измените методы <tt>start()</tt> и <tt>stop()</tt> в классе активатора пакета, чтобы добавить следующие строки (выделено жирным). |
| <pre class="examplecode"> |
| public class Activator implements BundleActivator { |
| |
| public void start(BundleContext context) throws Exception { |
| <strong>System.out.println("HelloActivator::start"); |
| context.registerService(Hello.class.getName(), new HelloImpl(), null); |
| System.out.println("HelloActivator::registration of Hello service successful");</strong> |
| } |
| |
| public void stop(BundleContext context) throws Exception { |
| <strong>context.ungetService(context.getServiceReference(Hello.class.getName())); |
| System.out.println("HelloActivator stopped");</strong> |
| } |
| }</pre> |
| |
| <p>Класс активатора пакета импортирует <tt>org.osgi.framework.BundleActivator</tt> и <tt>org.osgi.framework.BundleContext</tt>. По умолчанию создаваемый класс содержит два метода: <tt>start()</tt> и <tt>stop()</tt>. Платформа OSGi вызывает методы <tt>start()</tt> и <tt>stop()</tt> для включения и отключения функциональных возможностей пакета. При запуске пакета, компонент службы пакета регистрируется в реестре служб OSGi. После регистрации пакета, остальные пакеты могут найти в реестре и использовать через контекст пакета активные службы.</p> |
| |
| <p>Если посмотреть на файл POM для проекта, то можно увидеть элемент <tt><Bundle-Activator></tt>, который указывает активатор пакета в элементе настройки для <tt>maven-bundle-plugin</tt>.</p> |
| <pre class="examplecode"> |
| <plugin> |
| <groupId>org.apache.felix</groupId> |
| <artifactId>maven-bundle-plugin</artifactId> |
| <version>2.3.7</version> |
| <extensions>true</extensions> |
| <configuration> |
| <instructions> |
| <strong><Bundle-Activator>com.mycompany.mavenhelloserviceimpl.Activator</Bundle-Activator></strong> |
| </instructions> |
| </configuration> |
| </plugin></pre> |
| <p>При сборке пакета подключаемый модуль создает заголовок манифеста в файле манифеста проекта в файле JAR и указывает класс активатора пакета. При развертывании пакета среда выполнения OSGi ищет в файле манифеста заголовок <tt>Bundle-Activator</tt>.</p> |
| </li> |
| <li>Исправьте операторы импорта в <tt>Activator.java</tt> для импорта <tt>com.mycompany.mavenhelloserviceapi.Hello</tt>. Сохраните изменения.</li> |
| <li>Разверните узел "Зависимости" и убедитесь, что артефакт <tt>org.osgi.core</tt> добавлен в список зависимостей. |
| <p class="notes"><strong>Примечание.</strong> Удалите все предыдущие версии артефакта в узле 'Зависимости'. Для этого щелкните артефакт правой кнопкой мыши и выберите 'Удалить зависимость'. Узел "Зависимости" должен содержать только проект MavenHelloServiceApi и артефакт <tt>org.osgi.core</tt>.</p> |
| <img alt="снимок окна 'Проекты'" class="margin-around b-all" src="../../../images_www/articles/80/javaee/osgi-cdi/cdi-implproject.png" title="Класс 'Активатор' в окне 'Проекты'." /> |
| </li> |
| </ol> |
| |
| |
| |
| <!-- ===================================================================================== --> |
| <!-- Building and Deploying Bundles --> |
| <!-- ===================================================================================== --> |
| <a name="Exercise_2c"></a> |
| <h3>Сборка и развертывание пакетов OSGi</h3> |
| <p>В этом упражнении пакеты OSGi будут собраны и развернуты на сервере GlassFish.</p> |
| |
| <ol> |
| <li>Щелкните правой кнопкой мыши узел MavenOSGiCDIProject в окне "Проекты" и выберите пункт "Очистить и собрать". |
| <p>При сборке проекта среда IDE создает файлы JAR в папке <tt>target</tt> каждого из проектов, а также устанавливает снимок JAR в локальный репозиторий. В окне "Файлы" можно развернуть папку <tt>target</tt> для каждого из двух проектов пакетов чтобы увидеть два архива JAR (<tt>MavenHelloServiceApi-1.0-SNAPSHOT.jar</tt> и <tt>MavenHelloServiceImpl-1.0-SNAPSHOT.jar</tt>).</p> |
| </li> |
| <li>Запустите сервер GlassFish, если он еще не запущен.</li> |
| <li>Скопируйте <tt>MavenHelloServiceApi-1.0-SNAPSHOT.jar</tt> в каталог <tt>glassfish/domains/domain1/autodeploy/bundles/</tt> вашей установки GlassFish. |
| |
| <p>Вы должны увидеть выходные данные, похожие на следующие данные журнала сервера GlassFish, в окне выходных данных.</p> |
| <pre class="examplecode"> |
| INFO: Started bundle: file:/glassfish-4.0/glassfish/domains/domain1/autodeploy/bundles/MavenHelloServiceApi-1.0-SNAPSHOT.jar |
| </pre> |
| <p class="tips">Щелкните правой кнопкой мыши узел сервера GlassFish в окне "Службы" и выберите пункт "Просмотреть журнал сервера домена", если журнал сервера не виден в окне вывода.</p> |
| </li> |
| <li>Повторите действия по копированию файла <tt>MavenHelloServiceImpl-1.0-SNAPSHOT.jar</tt> в каталог <tt>autodeploy/bundles</tt>. </li> |
| </ol> |
| |
| <p>Теперь в журнале сервера GlassFish вы должны видеть примерно следующий результат.</p> |
| <pre class="examplecode"> |
| INFO: HelloActivator::start |
| INFO: HelloActivator::registration of Hello service successful |
| INFO: Started bundle: file:/glassfish-4.0/glassfish/domains/domain1/autodeploy/bundles/MavenHelloServiceImpl-1.0-SNAPSHOT.jar |
| INFO: Started bundle: file:/glassfish-4.0/glassfish/domains/domain1/autodeploy/bundles/MavenHelloServiceImpl-1.0-SNAPSHOT.jar |
| </pre> |
| |
| |
| |
| <p class="tips">В качестве альтернативы можно установить пакеты из консоли администрирования GlassFish OSGi. Дополнительные сведения приведены в разделе <a href="#Exercise_4">Установка и использование консоли администрирования OSGi</a>.</p> |
| </div> |
| |
| |
| <!-- ===================================================================================== --> |
| <!-- Creating the web client application --> |
| <!-- ===================================================================================== --> |
| <a name="Exercise_3"></a> |
| <h2>Создание клиентского веб-приложения</h2> |
| <p>В этом разделе показано создание веб-клиента Java EE, использующего службу пакета OSGi. Создается простой сервлет в веб-приложении, а затем внедряются объявленные службы. Перед созданием проекта в родительский проект POM добавляются некоторые элементы управления зависимостями.</p> |
| |
| |
| <div class="indent"> |
| |
| <a name="Exercise_3a"></a> |
| <h3>Настройка зависимостей в родительском проекте POM</h3> |
| <p>В этом упражнении указываются элементы зависимости в родительском проекте POM. Кроме того, добавляется репозиторий для артефактов, который будет использоваться в проекте.</p> |
| |
| <ol> |
| <li>Разверните узел "Файлы проекта" в проекте <strong>MavenOSGiCDIProject</strong> в окне проектов и дважды щелкните файл <tt>pom.xml</tt>, чтобы открыть файл в редакторе.</li> |
| <li>Измените родительский файл <tt>pom.xml</tt>, добавив следующие элементы управления зависимостями (выделены жирным шрифтом). Сохраните изменения. |
| <pre class="examplecode"> |
| <?xml version="1.0" encoding="UTF-8"?> |
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
| <modelVersion>4.0.0</modelVersion> |
| <groupId>com.mycompany</groupId> |
| <artifactId>MavenOSGiCDIProject</artifactId> |
| <version>1.0-SNAPSHOT</version> |
| <packaging>pom</packaging> |
| <properties> |
| <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
| </properties> |
| |
| ... |
| |
| <dependencyManagement> |
| <dependencies> |
| <dependency> |
| <groupId>org.osgi</groupId> |
| <artifactId>org.osgi.core</artifactId> |
| <version>4.3.0</version> |
| <scope>provided</scope> |
| </dependency> |
| <strong><dependency> |
| <groupId>org.osgi</groupId> |
| <artifactId>org.osgi.compendium</artifactId> |
| <version>4.2.0</version> |
| <scope>provided</scope> |
| </dependency> |
| <dependency> |
| <groupId>org.glassfish</groupId> |
| <artifactId>osgi-cdi-api</artifactId> |
| <version>3.1-b41</version> |
| <type>jar</type> |
| <scope>provided</scope> |
| </dependency></strong> |
| |
| </dependencies> |
| </dependencyManagement> |
| |
| ... |
| </project> |
| </pre> |
| </li> |
| <li>Добавьте следующие элементы, чтобы добавить к POM репозиторий GlassFish. Сохраните изменения. |
| <pre class="examplecode"> |
| <project> |
| |
| ... |
| |
| </dependencyManagement> |
| |
| <strong><repositories> |
| <!-- glassfish nexus repo for glassfish dependencies --> |
| <repository> |
| <id>glassfish-repo-archive</id> |
| <name>Nexus repository collection for Glassfish</name> |
| <url>http://maven.glassfish.org/content/groups/glassfish</url> |
| <snapshots> |
| <updatePolicy>never</updatePolicy> |
| </snapshots> |
| </repository> |
| </repositories></strong> |
| <modules> |
| <module>MavenHelloServiceApi</module> |
| <module>MavenHelloServiceImpl</module> |
| </modules> |
| </project> |
| </pre> |
| </li> |
| </ol> |
| |
| <p>После добавления репозитория GlassFish в POM при просмотре списка репозиториев в узле 'Репозитории Maven' в окне 'Службы' вы увидите, что среда IDE автоматически добавила узел для репозитория GlassFish. По умолчанию среда IDE отображает узел для локального репозитория Maven. Когда в открытом проекте указан репозиторий, среда IDE автоматически добавляет узел репозитория под узлом 'Репозитории Maven'. |
| </p> |
| <img alt="снимок окна 'Репозитории Maven'" class="margin-around b-all" src="../../../images_www/articles/72/javaee/osgi-cdi/cdi-maven-repositories.png" title="Репозиторий GlassFish в окне 'Репозиториии Maven'" /> |
| |
| <p>В этом упражнении добавлены дополнительные артефакты и версии артефактов, которые будут использоваться в проекте. Кроме того, добавлен репозиторий GlassFish, содержащий артефакты <tt>osgi-cdi-api</tt>.</p> |
| |
| |
| |
| <a name="Exercise_3b"></a> |
| <h3>Создание веб-приложения MavenHelloWebClient </h3> |
| <p>Сначала создайте обычное веб-приложение, затем преобразуйте проект в комплект OSGi (комплект веб-приложения (WAB)).</p> |
| <ol> |
| <li>В главном меню выберите "Файл" > "Новый проект".</li> |
| <li>Выберите в категории Maven пункт "Веб-приложение". Нажмите кнопку "Далее".</li> |
| <li>Введите <strong>MavenHelloWebClient</strong> в поле имени проекта.</li> |
| <li>Нажмите кнопку "Обзор" и выберите проект POM <strong>MavenOSGiCDIProject</strong> в качестве местоположения (если он еще не выбран). Нажмите кнопку "Далее".</li> |
| <li>В качестве сервера выберите сервер GlassFish, а в качестве версии Java EE укажите Java EE 6 Web или Java EE 7 Web. Нажмите кнопку "Завершить".</li> |
| <li>Щелкните правой кнопкой мыши узел проекта и выберите в меню "Создать" пункт "Сервлет".</li> |
| <li>Введите <strong>HelloServlet</strong> в поле имени класса.</li> |
| <li>В списке 'Пакет' выберите <tt>com.mycompany.mavenhellowebclient</tt>. Нажмите кнопку "Завершить".</li> |
| <li>Удалите созданные средой IDE методы по умолчанию (<tt>processRequest</tt>, <tt>doGet</tt>, <tt>doPost</tt>, <tt>getServletInfo</tt>). |
| <p class="notes"><strong>Примечание.</strong> Потребуется расширить свертывание редактора для удаления методов HttpServlet.</p></li> |
| <li>Для внедрения службы введите следующий код (выделен жирным). |
| <pre class="examplecode"> |
| @WebServlet(name = "HelloServlet", urlPatterns = {"/HelloServlet"}) |
| public class HelloServlet extends HttpServlet { |
| |
| <strong>@Inject |
| @OSGiService(dynamic=true) |
| Hello hello;</strong> |
| }</pre> |
| </li> |
| <li>Добавьте следующий метод <tt>doGet</tt>. |
| <pre class="examplecode"> |
| @Override |
| protected void doGet(HttpServletRequest request, HttpServletResponse response) |
| throws ServletException, IOException { |
| PrintWriter out = response.getWriter(); |
| out.println(hello.sayHello("Duke")); |
| }</pre> |
| </li> |
| <li>Щелкните узел проекта правой кнопкой мыши и выберите команду "Создать" > "Другие".</li> |
| <li>Выберите <strong>beans.xml</strong> в категории "Подключение контекстов и зависимостей". Нажмите кнопку "Далее".</li> |
| <li>Используйте имя файла по умолчанию (<tt>beans</tt>). Нажмите кнопку "Завершить". |
| <p>При нажатии кнопки "Готово" мастер создает в веб-приложении файл <tt>beans.xml</tt>. Среда CDI автоматически включена, если <tt>beans.xml</tt> является частью приложения. </li> |
| <li>В файле <tt>beans.xml</tt> измените значение параметра <tt>bean-discovery-mode</tt> на <tt>all</tt>. |
| <pre class="examplecode">bean-discovery-mode="<strong>all</strong>"</pre> |
| <p>Сохраните изменения и закройте файл.</p> |
| <p>Подробные сведения о различиях между значениями параметра <tt>bean-discovery-mode</tt> см. на следующих страницах:</p> |
| <ul> |
| <li><a href="http://docs.oracle.com/javaee/7/tutorial/doc/cdi-adv001.htm">25.1 Упаковка приложений CDI</a> в учебном курсе по Java EE 7</li> |
| <li><a href="http://stackoverflow.com/questions/18107858/cdi-inject-fails-on-maven-embedded-glassfish-plugin-org-jboss-weld-exceptions">http://stackoverflow.com/questions/18107858/cdi-inject-fails-on-maven-embedded-glassfish-plugin-org-jboss-weld-exceptions</a> </li> |
| </ul> |
| </li> |
| <li>Щелкните правой кнопкой мыши узел "Зависимости" в MavenHelloWebClient в окне проектов и выберите пункт "Добавить зависимость".</li> |
| <li>Выберите <strong>"Предоставленный"</strong> в качестве области действия.</li> |
| <li>Щелкните в диалоговом окне добавления библиотеки вкладку "Открытые проекты" и выберите <strong>пакет MavenHelloServiceApi OSGi </strong>. Нажмите кнопку "Add".</li> |
| <li>Снова щелкните правой кнопкой мыши узел "Зависимости" и выберите пункт "Добавить зависимость".</li> |
| <li>Щелкните вкладку "Управление зависимостями" в диалоговом окне "Добавить библиотеку" и выберите артефакт <tt>osgi-cdi-api</tt>, указанный в родительском проекте POM. Нажмите кнопку "Add".<br /> <img alt="снимок диалогового окна 'Добавить библиотеку'" class="margin-around b-all" src="../../../images_www/articles/80/javaee/osgi-cdi/cdi-add-dependency3.png" title="Вкладка 'Управление зависимостями' в диалоговом окне 'Добавить библиотеку'" /> |
| </li> |
| <li>Щелкните правой кнопкой мыши <tt>HelloServlet.java</tt> в редакторе и выберите 'Исправить выражения импорта' (Alt-Shift-I; ⌘-Shift-I в Mac), чтобы добавить <tt>com.mycompany.mavenhelloserviceapi.Hello</tt>, <tt>javax.inject.Inject</tt> и <tt>org.glassfish.osgicdi.OSGiService</tt>. Сохраните изменения. |
| |
| <p class="notes"><strong>Примечание.</strong> Может потребоваться добавление вручную операторов импорта для <tt>com.mycompany.mavenhelloserviceapi.Hello</tt>, если среда IDE не добавит их автоматически.</p> |
| </li> |
| <li>Щелкните правой кнопкой мыши MavenOSGiCDIProject и выберите пункт "Очистка и сборка".</li> |
| |
| </ol> |
| <p>При сборке проекта в окне вывода должен появиться результат, похожий на следующий.</p> |
| <pre class="examplecode"> |
| Reactor Summary: |
| |
| MavenOSGiCDIProject ............................... SUCCESS [0.798s] |
| MavenHelloServiceApi OSGi Bundle .................. SUCCESS [7.580s] |
| MavenHelloServiceImpl OSGi Bundle ................. SUCCESS [1.142s] |
| MavenHelloWebClient ............................... SUCCESS [8.072s] |
| ------------------------------------------------------------------------ |
| BUILD SUCCESS</pre> |
| <p class="notes"><strong>Примечание.</strong> Если при сборке проекта MavenOSGiCDIProject веб-приложение не собирается автоматически, потребуется собрать его вручную.</p> |
| <p>В окне файлов разверните узел проекта для веб-приложения и подтвердите, что архив <tt>MavenHelloWebClient-1.0-SNAPSHOT.war</tt> был создан в целевом каталоге. Если вы развернете архив WAR веб-клиента и исследуете <tt>MANIFEST.MF</tt>, то увидите, что в манифесте содержатся строки, похожие на следующие.</p> |
| <pre class="examplecode"> |
| Manifest-Version: 1.0 |
| Archiver-Version: Plexus Archiver |
| Created-By: Apache Maven |
| Built-By: nb |
| Build-Jdk: 1.7.0_45</pre> |
| |
| |
| |
| |
| <a name="Exercise_3c"></a> |
| <h3>Сборка веб-приложения как пакета OSGi</h3> |
| <p>Для использования <tt>@OSGiService</tt> и получения зарегистрированных пакетов OSGi необходимо сделать веб-приложение пакетом, который может получать доступ к <tt>BundleContext</tt>. Чтобы сделать архив WAR пакетом OSGi (пакет веб-приложения), можно добавить метаданные <tt>Web-ContextPath</tt> к файлу <tt>MANIFEST.MF</tt> в архиве WAR. |
| <!-- To do this, you create a properties file that contains the meta-data, |
| and then modify the POM so that the meta-data is included in the <tt>MANIFEST.MF</tt> when you build the WAR.--> |
| Для этого укажите элемент <tt><Web-ContextPath></tt> в инструкциях к модулю <tt>maven-bundle-plugin</tt>, и созданный этим модулем манифест будет содержать этот элемент. Затем измените настройку <tt>maven-war-plugin</tt>, чтобы дать указание модулю добавить манифест, созданный <tt>maven-bundle-plugin</tt>, к архиву WAR. |
| </p> |
| |
| |
| <ol> |
| |
| <li>В окне 'Проекты' разверните узел 'Файлы проекта' в MavenHelloWebClient и дажды щелкните <tt>pom.xml</tt>, чтобы открыть файл в редакторе.</li> |
| <li>Добавьте следующую запись, чтобы добавить <tt>maven-bundle-plugin</tt> к POM. |
| <pre class="examplecode"> |
| <build> |
| <plugins> |
| <strong><plugin> |
| <groupId>org.apache.felix</groupId> |
| <artifactId>maven-bundle-plugin</artifactId> |
| <version>2.2.0</version> |
| <extensions>true</extensions> |
| <configuration> |
| <supportedProjectTypes> |
| <supportedProjectType>ejb</supportedProjectType> |
| <supportedProjectType>war</supportedProjectType> |
| <supportedProjectType>bundle</supportedProjectType> |
| <supportedProjectType>jar</supportedProjectType> |
| </supportedProjectTypes> |
| <instructions><!-- <!-- Read all OSGi configuration info from this optional file --> |
| <_include>-osgi.properties</_include>--> |
| <!-- Specify elements to add to MANIFEST.MF --> |
| <Web-ContextPath>/mavenhellowebclient</Web-ContextPath> |
| <!-- By default, nothing is exported --> |
| <Export-Package>!*.impl.*, *</Export-Package> |
| </instructions> |
| </configuration> |
| <executions> |
| <execution> |
| <id>bundle-manifest</id> |
| <phase>process-classes</phase> |
| <goals> |
| <goal>manifest</goal> |
| </goals> |
| </execution> |
| <execution> |
| <id>bundle-install</id> |
| <phase>install</phase> |
| <goals> |
| <goal>install</goal> |
| </goals> |
| </execution> |
| </executions> |
| </plugin></strong> |
| </pre> |
| </li> |
| <li>Исправьте элементы настройки в <tt>maven-war-plugin</tt>, чтобы добавить информацию о пакете к <tt>MANIFEST.MF</tt>. Сохраните изменения. |
| <pre class="examplecode"> |
| <plugin> |
| <groupId>org.apache.maven.plugins</groupId> |
| <artifactId>maven-war-plugin</artifactId> |
| <version>2.3</version> |
| <configuration> |
| <strong><archive> |
| <!-- add bundle plugin generated manifest to the war --> |
| <manifestFile> |
| ${project.build.outputDirectory}/META-INF/MANIFEST.MF |
| </manifestFile> |
| <!-- For some reason, adding Bundle-ClassPath in maven-bundle-plugin |
| confuses that plugin and it generates wrong Import-Package, etc. |
| So, we generate it here.--> |
| <manifestEntries> |
| <Bundle-ClassPath>WEB-INF/classes/</Bundle-ClassPath> |
| </manifestEntries> |
| </archive></strong> |
| <failOnMissingWebXml>false</failOnMissingWebXml> |
| </configuration> |
| </plugin></pre> |
| </li> |
| <li>Щелкните правой кнопкой мыши узел проекта MavenHelloWebClient project в окне проектов и выберите пункт "Очистка и сборка". </li> |
| |
| </ol> |
| <p>Теперь, если развернуть архив WAR и открыть файл <tt>MANIFEST.MF</tt> в редакторе, видно, что <tt>MANIFEST.MF</tt> теперь содержит дополнительные сведения, в том числе запись <tt>Web-ContextPath: /mavenhellowebclient</tt>, указанную в настройке <tt>maven-bundle-plugin</tt> и записях имени пакета.</p> |
| |
| <pre class="examplecode"> |
| Manifest-Version: 1.0 |
| Export-Package: com.mycompany.mavenhellowebclient;uses:="com.mycompany |
| .mavenhelloserviceapi,javax.servlet,org.glassfish.osgicdi,javax.injec |
| t,javax.servlet.annotation,javax.servlet.http";version="1.0.0.SNAPSHO |
| T" |
| Bundle-ClassPath: WEB-INF/classes/ |
| Built-By: nb |
| Tool: Bnd-1.50.0 |
| Bundle-Name: MavenHelloWebClient |
| Created-By: Apache Maven Bundle Plugin |
| <strong>Web-ContextPath: /mavenhellowebclient</strong> |
| Build-Jdk: 1.7.0_45 |
| Bundle-Version: 1.0.0.SNAPSHOT |
| Bnd-LastModified: 1395053424008 |
| Bundle-ManifestVersion: 2 |
| Import-Package: com.mycompany.mavenhelloserviceapi;version="[1.0,2)",j |
| avax.inject,javax.servlet,javax.servlet.annotation,javax.servlet.http |
| ,org.glassfish.osgicdi;version="[1.0,2)" |
| Bundle-SymbolicName: com.mycompany.MavenHelloWebClient |
| Archiver-Version: Plexus Archiver</pre> |
| |
| <p class="tips">Дополнительные сведения о сборке веб-приложений, таких как пакеты OSGi, приведены на следующих страницах.</p> |
| <ul> |
| <li><a href="http://weblogs.java.net/blog/2009/06/04/osgi-enabled-web-applications-inglassfish"> http://weblogs.java.net/blog/2009/06/04/osgi-enabled-web-applications-inglassfish</a></li> |
| <li><a href="http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html"> http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html</a></li> |
| </ul> |
| |
| |
| |
| |
| |
| <a name="Exercise_3d"></a> |
| <h3>Развертывание пакета веб-приложения</h3> |
| <p>В этом упражнении пакет веб-приложения будет скопирован в папку <tt>autodeploy/bundles</tt> в установке GlassFish.</p> |
| <ol> |
| <li>Перейдите в каталог <tt>target</tt>, содержащий <tt>MavenHelloWebClient-1.0-SNAPSHOT.war</tt>.</li> |
| <li>Скопируйте <tt>MavenHelloWebClient-1.0-SNAPSHOT.war</tt> в папку <tt>autodeploy/bundles</tt> вашей установки GlassFish.</li> |
| </ol> |
| |
| <p>При копировании архива WAR в каталог в журнале сервера GlassFish появится примерно такой результат.</p> |
| <pre class="examplecode"> |
| INFO: Started bundle: file:/glassfish-3.1.1/glassfish/domains/domain1/autodeploy/bundles/MavenHelloWebClient-1.0-SNAPSHOT.war |
| ... |
| INFO: ---- Injection requested for framework service type interface com.mycompany.mavenhelloserviceapi.Hello and annotated with dynamic=true, serviceCriteria= |
| INFO: WEB0671: Loading application [com.mycompany.MavenHelloWebClient_1.0.0.SNAPSHOT] at [/mavenhellowebclient] |
| INFO: Registered ServletContext as a service with properties: {osgi.web.symbolicname=com.mycompany.MavenHelloWebClient, osgi.web.version=1.0.0.SNAPSHOT, osgi.web.contextpath=/mavenhellowebclient} |
| </pre> |
| |
| <p>Теперь можно просмотреть сервлет в браузере, щелкнув следующую ссылку <a href="http://localhost:8080/mavenhellowebclient/HelloServlet">http://localhost:8080/mavenhellowebclient/HelloServlet</a>.</p> |
| |
| </div> |
| |
| |
| <a name="Exercise_4"></a> |
| <h2>Установка и использование консоли администрирования OSGi</h2> |
| |
| <p>Можно использовать консоль администрирования OSGi GlassFish для установки, запуска и останова пакетов OSGi, развернутых на сервере. В этом упражнении будет включена консоль администрирования OSGi GlassFish, а затем просмотрен список зарегистрированных пакетов OSGi.</p> |
| <p>Выполните следующие действия по установке требуемых дополнительных надстроек GlassFish, чтобы включить консоль OSGi и просмотреть развернутые пакеты в консоли администрирования домена GlassFish.</p> |
| <ol> |
| <li>Откройте консоль администрирования домена GlassFish в своем браузере. |
| <p class="tips">Щелкните правой кнопкой мыши узел сервера GlassFish в окне "Службы" и выберите пункт "Просмотреть консоль администрирования домена".</p></li> |
| <li>Щелкните средство обновления в левом столбце навигации.</li> |
| <li>Выберите <tt>glassfish-osgi-gui</tt> из списка допустимых надстроек. |
| <p>Нажмите "Установить" и примите лицензионное соглашение.</p> |
| <img alt="снимок средства обновления консоли администратора GlassFish" class="margin-around b-all" src="../../../images_www/articles/80/javaee/osgi-cdi/cdi-glassfish-addons.png" title="Средство обновления консоли администратора GlassFish" /> |
| </li> |
| <li>Перезапустите сервер приложений GlassFish. |
| <p class="alert"><strong>Важно!</strong> При работе с GlassFish Server 3.1.2.2 необходимо внести изменения в файл <tt>osgi.properties</tt>, который находится в каталоге <tt><em>GLASSFISH-INSTALL</em>/glassfish/config/</tt>, и задать для свойства <tt>org.osgi.framework.startlevel.beginning</tt> значение '2' (<tt>org.osgi.framework.startlevel.beginning=2</tt>).<br> Дополнительную информацию см. в сообщении форума: <br><a href="http://www.java.net/forum/topic/glassfish/glassfish/cannot-start-web-console-glassfish-version-3122"> Невозможно запустить веб-консоль на Glassfish версии 3.1.2.2</a>.</p> |
| </li> |
| <li>Снова откройте консоль администрирования и выберите пункт <strong>сервер (сервер администрирования)</strong> в левом столбце навигации.</li> |
| <li>Щелкните по вкладке консоли OSGi, чтобы просмотреть список развернутых пакетов OSGi. <br /> <img alt="снимок диалогового окна 'Добавить библиотеку'" class="margin-around b-all" src="../../../images_www/articles/80/javaee/osgi-cdi/cdi-glassfish-console.png" title="Вкладка 'Управление зависимостями' в диалоговом окне 'Добавить библиотеку'" /> |
| <p class="notes"><strong>Примечание.</strong> На экране может отобразиться запрос на ввод имени пользователя и пароля для просмотра списка пакетов OSGi. Если на вкладке "Консоль OSGi" не отображается список пакетов, убедитесь, что не скрыто диалоговое окно авторизации. По умолчанию для GlassFish 4 используется имя пользователя <tt>admin</tt> (если сервер был установлен вместе с IDE). Пароль по умолчанию пуст.</p> |
| |
| </li> |
| </ol> |
| |
| <p>Можно прокрутить список ниже, чтобы просмотреть состояние зарегистрированных пакетов OSGi, запускать и останавливать отдельные пакеты. Если упорядочить список по идентификатору (от высшего к низшему), на первых позициях в списке отобразятся три развернутых пакета.</p> |
| |
| |
| |
| |
| <br> |
| <div class="feedback-box" ><a href="/about/contact_form.html?to=3&subject=Feedback:%20Using%20CDI%20to%20Inject%20OSGi%20Bundles%20as%20Services">Отправить отзыв по этому учебному курсу</a></div> |
| <br style="clear:both;" /> |
| <!-- ======================================================================================= --> |
| <h2><a name="nextsteps"></a>Дополнительные сведения</h2> |
| <p>For more information about using IDE NetBeans and Maven to develop OSGi bundles, see the following resources: |
| </p> |
| <ul> |
| <li><a href="http://wiki.netbeans.org/OSGiAndNetBeans">OSGi и NetBeans на wiki.netbeans.org</a></li> |
| <li><a href="http://wiki.netbeans.org/MavenBestPractices" target="_blank">Испытанные приемы для Apache Maven в IDE NetBeans</a></li> |
| <li><a href="https://blogs.oracle.com/arungupta/entry/totd_125_creating_an_osgi" target="_blank">TOTD #125: Создание пакетов OSGi с помощью NetBeans и развертывание в GlassFish</a></li> |
| <li><a href="../../trails/java-ee.html">Учебная карта по Java EE и Java Web</a></li> |
| </ul> |
| |
| <p>To send comments and suggestions, get support, and keep informed on the latest developments on the IDE NetBeans Java EE development features, <a href="../../../community/lists/top.html">join the nbj2ee mailing list</a>.</p> |
| </body> |
| </html> |