corner imagecorner image
IDEPlatformPluginsDocs & SupportCommunityPartners

Maven を使用した OSGi 宣言型サービス

NetBeans IDE 6.9 では Open Services Gateway Initiative (OSGi) フレームワークの統合サポートによって、OSGi バンドルを作成するプロセスおよびプロジェクトでそのバンドルを使用するプロセスが簡素化されました。このドキュメントではそのしくみについて説明します。このチュートリアルでは、最初に Maven OSGi バンドルの原型から単純な OSGi バンドルを作成し、そのバンドルを IDE に含まれている Felix OSGi コンテナに配備します。

基本的な OSGi バンドルの作成後、OSGi 宣言型サービスをバンドルに実装し、Apache Felix Maven SCR プラグインを使用してそのバンドルを構築します。次に、バンドルを GlassFish Server Open Source Edition 3.0.1 に配備すると、Felix コンテナが、そのバンドルによって提供されるサービスを開始します。バンドルの配備後、そのサービスにアクセスする単純な Java EE Web クライアントを作成します。

エンタープライズアプリケーションで OSGi バンドルを使用すると、個別のバンドルを更新する際のモジュール性および柔軟性を高めることができます。GlassFish サーバーがデフォルトで OSGi をサポートすることによって、アプリケーションにバンドルを組み込む作業はきわめて簡単になります。

このチュートリアルは、Arun Gupta 氏のブログ (「今日のヒント 第 124 回 OSGi 宣言型サービス」およびその他のブログ投稿) に基づいています。OSGi の操作に関するその他の役立つ情報については、このブログを参照してください。

チュートリアルの課題

このページの内容は NetBeans IDE 6.9 が対象です

このチュートリアルに従うには、次のソフトウェアとリソースが必要です。

ソフトウェアまたはリソース 必須バージョン
NetBeans IDE 6.9、Java バージョン
Java Development Kit (JDK) version 6
GlassFish Server Open Source Edition 3.0.1
Maven 2.09 以降

注: GlassFish サーバーには Java Development Kit (JDK) 6 が必要です。

前提条件

このドキュメントは、次のテクノロジについて基本的な知識またはプログラミング経験を持つ読者を想定して書かれています。

  • Java プログラミング
  • NetBeans IDE
  • Maven フレームワーク

このチュートリアルを開始する前に、必要に応じて次のドキュメントをお読みください。

OSGi バンドルプロジェクトの作成

「新規プロジェクト」ウィザードの「Maven」カテゴリには、OSGi バンドルプロジェクトを作成するための OSGi バンドルの原型が用意されています。OSGi バンドルプロジェクトを作成すると、生成された POM は、org.osgi.core JAR を依存リソースとして宣言し、プロジェクト構築用に maven-bundle-plugin を指定します。

バンドルの作成

この課題では、「新規プロジェクト」ウィザードを使用して OSGi バンドルプロジェクトを作成します。

  1. 「ファイル」>「新規プロジェクト」を選択し、「新規プロジェクト」ウィザードを開きます。
  2. 「Marven」カテゴリから「Maven OSGi バンドル」を選択します。「次へ」をクリックします。
    「新規プロジェクト」ウィザードのスクリーンショット
  3. 「プロジェクト名」に「MavenHelloService」と入力します。「完了」をクリックします。
  4. プロジェクトの「プロパティー」ウィンドウを開き、「ソース」カテゴリの「ソース/バイナリ形式」が「1.6」に、「エンコーディング」が「UTF-8」に設定されていることを確認します。

「Maven OSGi バンドル」原型を使用して OSGi バンドルプロジェクトを作成すると、IDE は依存リソースとして org.osgi.core-1.4.0.jar を自動的に追加します。pom.xml を見ると、「パッケージング」要素が「bundle」に指定されていることがわかります。

<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany</groupId>
<artifactId>MavenHelloService</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>bundle</packaging>
<name>MavenHelloService OSGi Bundle</name>

バンドルを構築するときに maven-bundle-plugin が使用されることも POM は指定しています。

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <version>2.0.1</version>
                <extensions>true</extensions>
            </plugin>
        </plugins>
    </build>

バンドルアクティベータの追加

この課題では、ウィザードを使用して、org.osgi.framework.BundleActivator インタフェースを実装する Installer という名前の Java クラスを作成します。バンドルアクティベータは、バンドルのライフサイクルを管理するために使用されます。バンドルアクティベータクラスは、バンドルがコンテナによって開始されるときにインスタンス化されます。

OSGi バンドルにはバンドルアクティベータクラスは必要ありませんが、アクティベータクラスで start() メソッドを使用して、たとえば、バンドルが必要とするサービスまたはその他のリソースを初期化できます。この課題では、「出力」ウィンドウにメッセージを出力するクラスに、少量のコード行を追加します。これにより、バンドルが開始および停止するタイミングを簡単に識別できます。

  1. 「プロジェクト」ウィンドウでバンドルプロジェクトを右クリックし、「新規」>「その他」を選択します。
  2. 「OSGi」カテゴリで「バンドルアクティベータ」を選択します。「次へ」をクリックします。
  3. 「クラス名」に「Installer」と入力し、「パッケージ」に「com.mycompany.mavenhelloservice」を選択します。「完了」をクリックします。
    「新規バンドルアクティベータ」ウィザードのスクリーンショット
  4. エディタで Installer.java を開き、start() メソッドおよび stop() メソッドに次の行を追加します。
    package com.mycompany.mavenhelloservice;
    
    import org.osgi.framework.BundleActivator;
    import org.osgi.framework.BundleContext;
    
    /**
     *
     * @author nb
     */
    public class Installer implements BundleActivator {
    
        public void start(BundleContext context) throws Exception {
            String userName = context.getProperty("user.name");
            System.out.println("Maven Hello Service: Started OSGi bundle");
            System.out.println("User Name: " + userName);
        }
    
        public void stop(BundleContext context) throws Exception {
            System.out.println("Maven Hello Service: Stopped OSGi bundle");
        }
    
    }
  5. 変更を保存します。

バンドルアクティベータクラスが org.osgi.framework.BundleActivator および org.osgi.framework.BundleContext をインポートしていることが確認できます。デフォルトでは、生成されたクラスには start() および stop() の 2 つのメソッドが含まれています。OSGi フレームワークは、start() メソッドおよび stop() メソッドを呼び出して、バンドルの提供する機能を開始および停止します。バンドルが開始されると、そのバンドルの提供するサービスコンポーネントが、OSGi サービスレジストリに登録されます。あるバンドルが登録されると、ほかのバンドルは、そのレジストリを使用してアクティブなサービスを検索し、バンドルコンテキストを介してそのサービスを使用できます。

プロジェクトの POM を見ると、IDE が <Bundle-Activator> 要素を「maven-bundle-plugin」の「構成」に追加したことがわかります。

<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <version>2.0.1</version>
    <extensions>true</extensions>
      <configuration>
            <instructions>
                  <Bundle-Activator>com.mycompany.mavenhelloservice.Installer</Bundle-Activator>
            </instructions>
      </configuration>
</plugin>

バンドルを構築すると、プラグインは、マニフェストヘッダーを JAR 内にあるバンドルのマニフェストファイルに生成し、バンドルアクティベータクラスを指定します。バンドルが配備されると、OSGi ランタイムがマニフェストファイル内の Bundle-Activator ヘッダーを検索します。

バンドルの構築および確認

この課題では、OSGi バンドルを構築します。次に、バンドルを Apache Felix OSGi 組み込みコンテナに配備すると、バンドルが正しく動作していることが確認できます。Apache Felix は IDE に含まれていますが、Eclipse Equinox などほかの OSGi コンテナを登録することもできます。

  1. プロジェクトを右クリックし、「構築」を選択します。

    「構築」をクリックすると、IDE は、スナップショット JAR を構築してローカルリポジトリにインストールします。

  2. 「実行」をクリックすると、「出力」ウィンドウに次の出力が表示されます。
    Welcome to Felix
    ================
    
    Maven Hello Service: Started OSGi bundle
    User Name: nb

これで、基本的な OSGi バンドルおよびバンドルアクティベータを作成できたので、機能を追加できるようになりました。このチュートリアルの後半では、このバンドルを変更してインタフェースを実装するサービスにしますが、最初にそのインタフェースを作成します。

インタフェースのバンドルの作成

この節では、ほかのバンドルによって実装されるインタフェースを提供する新しい OSGi バンドルを作成します。このインタフェースは、sayHello メソッドを持つ単純なクラスです。バンドルおよびクラスを作成したら、POM を変更してそのバンドルがほかのバンドルからアクセスできるようにすると、バンドルを構築したときに適切なマニフェストヘッダーが生成されるようになります。

API バンドルの作成

この課題では、バンドルおよびインタフェースを作成します。

  1. 「新規プロジェクト」ウィザードを開き、「Marven」カテゴリから「Maven OSGi バンドル」を選択します。「次へ」をクリックします。
  2. 「プロジェクト名」に「MavenHelloServiceAPI」と入力します。「完了」をクリックします。
  3. 「MavenHelloServiceAPI」プロジェクトの「ソースパッケージ」ノードを右クリックし、「新規」>「Java インタフェース」を選択します。「次へ」をクリックします。
  4. クラス名に「HelloService」と入力します。
  5. 「パッケージ」として「com.mycompany.mavenhelloserviceapi」を選択します。「完了」をクリックします。
  6. インタフェースに次のコードを追加し、変更内容を保存します。
    public interface HelloService {
    
        public String sayHello(String name);
    
    }

エクスポートするパッケージの指定

この課題では、プロジェクトの「プロパティー」ウィンドウを開き、ほかのバンドルおよびプロジェクトからアクセスできるようにするパッケージを選択します。デフォルトでは、あるバンドル内のクラスはほかのバンドルには表示されません。バンドル内の一部のクラスをアクセス可能にする場合は、エクスポートするパッケージを MANIFEST.MF 内で宣言する必要があります。そうすると、公開されたパッケージをほかのバンドルがインポートできるようになります。

  1. プロジェクトノードを右クリックし、「プロパティー」を選択します。
  2. 「パッケージをエクスポート」カテゴリを選択し、「com.mycompany.mavenhelloserviceapi」パッケージを選択します。「了解」をクリックします。
    「プロパティー」ウィンドウの「パッケージをエクスポート」のスクリーンショット

    「プロパティー」ウィンドウでエクスポートパッケージを選択すると、IDE は、エクスポートパッケージを指定するように POM を変更します。

    <plugin>
        <groupId>org.apache.felix</groupId>
        <artifactId>maven-bundle-plugin</artifactId>
        <version>2.0.1</version>
        <extensions>true</extensions>
        <configuration>
            <instructions>
                <Export-Package>com.mycompany.mavenhelloserviceapi</Export-Package>
                <Private-Package>com.mycompany.mavenhelloserviceapi.*</Private-Package>
            </instructions>
        </configuration>
    </plugin>
  3. プロジェクトノードを右クリックし、「構築」を選択します。

プロジェクトを構築すると、maven-bundle-pluginMANIFEST.MF ファイルの生成を処理します。コンパイルされた JAR の MANIFEST.MF ファイルを開くと、プラグインによって、エクスポートパッケージを宣言するマニフェストヘッダーが生成されたことがわかります。このエクスポートパッケージは POM 内に指定されたものです。

Manifest-Version: 1.0
Export-Package: com.mycompany.mavenhelloserviceapi
Bundle-Version: 1.0.0.SNAPSHOT
Build-Jdk: 1.6.0_17
Built-By: nb
Tool: Bnd-0.0.357
Bnd-LastModified: 1274279178454
Bundle-Name: MavenHelloServiceApi OSGi Bundle
Bundle-ManifestVersion: 2
Created-By: Apache Maven Bundle Plugin
Import-Package: com.mycompany.mavenhelloserviceapi
Bundle-SymbolicName: com.mycompany.MavenHelloServiceApi

OSGi コンテナは Export-Package マニフェストヘッダーを読み取り、バンドル外からアクセスできる、バンドル内のクラスを判断します。この例では、com.mycompany.mavenhelloserviceapi パッケージ内のクラスが公開されています。

GlassFish サーバーへの OSGi バンドルの配備

この課題では、インタフェースのバンドルを GlassFish サーバーに配備して、ほかのバンドルまたはアプリケーションからアクセスできるようにします。GlassFish サーバーにバンドルを配備するには、そのバンドルをサーバー上の適切なディレクトリにコピーするだけです。その後、Felix コンテナが自動的にそのバンドルを有効化して登録します。

この例では、OSGi バンドルを GlassFish サーバーに配備するための作業をコマンド行から実行します。コマンド行から実行する理由は、この作業に必要な UI が IDE に存在しないためです。バンドルを配備するにはさまざまな方法がありますが、この例では asadmin deploy コマンドを使用します。別の方法として、単純に JAR を GlassFish サーバーのインストールディレクトリ domains/domain1/autodeploy/bundles にコピーすることもできます。

GlassFish サーバーに OSGi バンドルを配備するその他の例および詳細は、Arun Gupta 氏の「今日のヒント 第 118 回: GlassFish v3 での OSGi バンドルの管理 - asadmin、ファイルシステム、telnet コンソール、Web ブラウザ、REST、osgish」を参照してください。また、Sahoo 氏のブログ投稿「ファイルシステム操作を使用して GlassFish で OSGi バンドルを管理する」で説明されているように、Apache Felix File Install エージェントを使用して独自の監視対象ディレクトリを作成することもできます。

  1. 「サービス」ウィンドウから GlassFish サーバーを起動します。または、コマンド行からサーバーを起動することもできます。
  2. コマンド行ターミナルを開きます。
  3. コマンド行から、MavenHelloServiceApi-1.0-SNAPSHOT.jar が格納されている target ディレクトリに移動します。
  4. ターミナルに次のコマンドを入力します。
    <glassfish-install>/glassfish/bin/asadmin deploy --type osgi MavenHelloServiceApi-1.0-SNAPSHOT.jar
    

    <glassfish-install> は、GlassFish サーバーのインストール場所です。ターミナルウィンドウに次のようなメッセージが表示されます。

    Authentication failed with password from login store: /Users/nb/.asadminpass
    Enter admin password for user "admin">
    
    Application deployed successfully with name MavenHelloServiceApi-1.0-SNAPSHOT.
    Command deploy executed successfully.

    注: パスワードの入力を求めるメッセージが表示された場合は、Enter キーを押します (デフォルトの管理パスワードは「null」)。

IDE の「出力」ウィンドウに次のようなメッセージが表示されます。

INFO: MavenHelloServiceApi-1.0-SNAPSHOT was successfully deployed in 372 milliseconds.

ターミナルで次のコマンドを入力すると、配備されたアプリケーションおよびバンドルを確認できます。

<glassfish-install>/glassfish/bin/asadmin list-applications
Authentication failed with password from login store: /Users/nb/.asadminpass
Enter admin password for user "admin">
MavenHelloServiceApi-1.0-SNAPSHOT 

これで、バンドルが配備され、ほかのバンドルからアクセスできるようになりました。次の節では、API バンドルを実装するサービスの作成方法について説明します。

OSGi バンドルのサービス化

この節では、MavenHelloService バンドルを変更して Maven SCR プラグインを追加し、このバンドルで API バンドルを実装するサービスを提供できるようにする方法について説明します。そのためには、サービスを宣言するための注釈を MavenHelloService プロジェクトのコードに追加します。プラグインによってこれらの注釈が処理されて、コンパイル中に構成ファイルが生成されるようになります。OSGi バンドルの構成ファイル内にあるサービスの宣言は、宣言型サービス仕様によって有効にされます。

プラグインおよび宣言型サービス仕様に関する詳細は、「Apache Felix Maven SCR Plugin」を参照してください。

SCR 注釈のサポートの追加

この課題では、org.apache.felix.scr.annotations ライブラリの依存リソースを追加し、コンポーネントおよびサービスの注釈をコード内で使用できるようにします。バンドルを構築すると、Maven SCR プラグインがその注釈を処理して XML 構成ファイルを生成します。

  1. 「プロジェクト」ウィンドウで「MavenHelloService」プロジェクトを展開します。
  2. 「ライブラリ」ノードを右クリックし、「依存リソースを追加」を選択します。
  3. 「グループ ID」に「org.apache.felix」、「アーティファクト ID」に「org.apache.felix.scr.annotations」、「バージョン」に「1.3.0」と入力します。「了解」をクリックします。

    または、検索用語 (たとえば、「scr.annotations」) をウィンドウに入力して、Maven リポジトリを検索することもできます。

「依存リソースを追加」ダイアログのスクリーンショット

IDE が POM を変更して依存リソースを宣言し、「プロジェクト」ウィンドウの「ライブラリ」ノードにその依存リソースを表示します。

サービスインタフェースの実装の作成

この課題では、バンドル内に単純な実装クラスを作成し、注釈を追加してサービスを宣言します。

  1. 「ソースパッケージ」を右クリックし、「新規」>「Java クラス」を選択します。「次へ」をクリックします。
  2. 「クラス名」に「HelloImpl」と入力します。
  3. 「パッケージ」に「com.mycompany.mavenhelloservice.impl」と入力します。「完了」をクリックします。
  4. HelloService インタフェースを実装し、次に abstract メソッドを実装します。
  5. 文字列「name」を返すように、sayHello メソッドを変更します。
    public class HelloImpl implements HelloService {
        public String sayHello(String name) {
            return "Hello " + name;
        }
    }
  6. @Service 注釈および @Component 注釈を追加します。
    package com.mycompany.mavenhelloservice.impl;
    
    import com.mycompany.mavenhelloservice.api.HelloService;
    import org.apache.felix.scr.annotations.Component;
    import org.apache.felix.scr.annotations.Service;
    
    /**
     *
     * @author nb
     */
    @Component(name="hello-service")
    @Service
    public class HelloImpl implements HelloService {
    
        public String sayHello(String name) {
            return "Hello " + name;
        }
    
    }

    @Component 注釈の name 属性が、サービスの名前を指定するために使用されます。

  7. org.apache.felix.scr.annotations.Component ライブラリおよび org.apache.felix.scr.annotations.Service ライブラリをインポートするように、インポートを修正します。

POM への Felix Maven SCR プラグインの追加

この課題では、POM を編集して maven-scr-plugin を構築プラグインとして追加し、プラグインが XML 構成ファイルを生成するように命令を追加します。

  1. 「プロジェクトファイル」ノードを展開し、pom.xml をエディタで開きます。
  2. POM を変更して maven-scr-plugin を構築プラグインとして追加します。
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-scr-plugin</artifactId>
                <executions>
                       <execution>
                            <id>generate-scr-scrdescriptor</id>
                            <goals>
                                <goal>scr</goal>
                            </goals>
                       </execution>
                </executions>
            </plugin>

プラグインの動作に関する詳細は、Apache Felix Maven SCR Plugin のページを参照してください。

バンドルの構築および配備

この課題では、バンドルを構築し、バンドル JAR の内容を確認します。

  1. バンドルプロジェクトを右クリックし、「構築」を選択します。

    「構築」を選択すると、IDE がプロジェクトの target ディレクトリ内に JAR を作成し、その JAR をローカルリポジトリにコピーします。「出力」ウィンドウに次のような出力が表示されます。

    Installing com/mycompany/MavenHelloService/1.0-SNAPSHOT/MavenHelloService-1.0-SNAPSHOT.jar
    Writing OBR metadata
    ------------------------------------------------------------------------
    BUILD SUCCESSFUL
    ------------------------------------------------------------------------
    Total time: 5 seconds
    Finished at: Fri May 07 16:34:41 CEST 2010
    Final Memory: 23M/79M
    ------------------------------------------------------------------------
    

    target ディレクトリ内に作成された JAR を展開すると、MANIFEST.MFMETA-INF ディレクトリ内に作成されていること、および serviceComponents.xmlOSGI-INF ディレクトリ内に作成されていることが確認できます。MANIFEST.MF を開くと、次のマニフェストヘッダーの詳細を確認できます。

    Manifest-Version: 1.0
    Service-Component: OSGI-INF/serviceComponents.xml
    Export-Package: com.mycompany.mavenhelloservice;uses:="com.mycompany.m
     avenhelloserviceapi,org.osgi.framework"
    Built-By: nb
    Tool: Bnd-0.0.357
    Bundle-Name: MavenHelloService OSGi Bundle
    Created-By: Apache Maven Bundle Plugin
    Build-Jdk: 1.6.0_17
    Bundle-Version: 1.0.0.SNAPSHOT
    Bnd-LastModified: 1274279195883
    Bundle-ManifestVersion: 2
    Bundle-Activator: com.mycompany.mavenhelloservice.Installer
    Bundle-SymbolicName: com.mycompany.MavenHelloService
    Import-Package: com.mycompany.mavenhelloservice,com.mycompany.mavenhel
     loserviceapi,org.osgi.framework;version="1.5"
    
    

    maven-bundle-pluginMANIFEST.MF ファイル内にマニフェストヘッダーを生成し、POM で指定されているようにバンドルアクティベータクラスを宣言していることがわかります。このファイルは、サービスが宣言されている serviceComponents.xml 記述子ファイルの場所も指定します。

    maven-scr-plugin は、serviceComponents.xml 記述子ファイルの生成を処理します。serviceComponents.xml を開くと、ファイルが名前、実装クラス、および指定したサービスのインタフェースを宣言していることがわかります。

    <components xmlns:scr="http://www.osgi.org/xmlns/scr/v1.0.0">
        <scr:component enabled="true" name="hello-service">
            <implementation class="com.mycompany.mavenhelloservice.HelloImpl"/>
            <service servicefactory="false">
                <provide interface="com.mycompany.mavenhelloserviceapi.HelloService"/>
            </service>
            <property name="service.pid" value="hello-service"/>
        </scr:component>
    </components>
  2. コマンド行から、MavenHelloService-1.0-SNAPSHOT.jar が格納されている target ディレクトリに移動します。
  3. ターミナルに次のコマンドを入力して、バンドルを配備します。
    <glassfish-install>/glassfish/bin/asadmin deploy --type osgi MavenHelloService-1.0-SNAPSHOT.jar
                

今回は、バンドルを配備すると IDE の「出力」ウィンドウに次のようなメッセージが表示されます。

INFO: Maven Hello Service: Started OSGi bundle
INFO: User Name: nb
INFO: MavenHelloService-1.0-SNAPSHOT was successfully deployed in 372 milliseconds.
        

「Maven Hello Service: Started OSGi bundle」というメッセージで、バンドルが配備されたときに Installer バンドルアクティベータクラスがインスタンス化されたことがわかります。

これでバンドルが配備されたので、ほかのバンドルおよびアプリケーションからサービスを使用できます。次の節では、Web クライアントからサービスにアクセスする方法について説明します。

Web クライアントアプリケーションの作成

この節では、OSGi バンドルの提供するサービスにアクセスする Java EE Web クライアントの作成方法について説明します。単純なサーブレットを Web アプリケーションで作成し、宣言されたサービスを注入します。

Web プロジェクトの作成

この課題では、Web アプリケーションプロジェクトを作成し、MavenHelloService バンドルの依存リソースを追加します。

  1. 「ファイル」>「新規プロジェクト」を選択し、「Maven」カテゴリから「Maven Web アプリケーション」を選択します。「次へ」をクリックします。
  2. 「プロジェクト名」に「MavenHelloWebClient」と入力します。「完了」をクリックします。
  3. プロジェクトの「プロパティー」ウィンドウを開き、「実行」カテゴリで「サーバー」を「GlassFish Server 3」に設定します。
  4. 「相対 URL」に「/HelloClient」と入力します。「了解」をクリックします。
  5. プロジェクトノードを右クリックし、「新規」>「サーブレット」を選択します。
  6. 「クラス名」に「HelloClient」と入力し、ドロップダウンリストから「com.mycompany.mavenhellowebclient」パッケージを選択します。「完了」をクリックします。
  7. 「ライブラリ」ノードを右クリックし、「依存リソースを追加」を選択します。
  8. 「クエリー」テキストフィールドに「helloservice」と入力し、ローカルリポジトリを検索します。
  9. com.mycompany グループの MavenHelloServiceAPI Snapshot バンドルを選択します。「了解」をクリックします。

    または、バンドルプロジェクトが IDE で開かれている場合は、「依存リソースを追加」ダイアログで「開いているプロジェクト」タブをクリックし、一覧からプロジェクトを選択します。

  10. POM を開き、<scope> 要素を MavenHelloServiceAPI の依存宣言に追加し、依存リソースを provided と指定します。
    <dependency>
          <groupId>${project.groupId}</groupId>
          <artifactId>MavenHelloServiceAPI</artifactId>
          <version>${project.version}</version>
          <scope>provided</scope>
    </dependency>

スコープを provided として指定することで、生成される WAR アーカイブに MavenHelloServiceAPI バンドルが含まれなくなります。前の節でバンドルをサーバーに配備しているため、バンドルを含める必要はありません。

サービスの注入

この課題では、HelloService リソースをサーブレットに注入し、サーブレットを変更して文字列を Web ページに出力するサービスを呼び出します。

  1. 注釈を使用してサービスリソースを注入します。
    @WebServlet(name="HelloClient", urlPatterns={"/HelloClient"})
    public class HelloClient extends HttpServlet {
    
       @Resource(mappedName="hello-service")
       HelloService helloService;
  2. processRequest メソッドを変更して println を追加し、サービス内で sayHello メソッドを呼び出します。
    out.println("<h1>Servlet HelloClient at " + request.getContextPath () + "</h1>");
    
    out.println(helloService.sayHello("Duke"));
    
    out.println("</body>");
    out.println("</html>");
  3. インポートを修正して変更内容を保存します。

アプリケーションの構築と実行

これで、Web アプリケーションを構築し、実行できます。

  1. Web アプリケーションプロジェクトを右クリックし、「実行」を選択します。

「実行」を選択すると、IDE がアプリケーションを構築し、WAR アーカイブをサーバーに配備してから、ブラウザが開いて HelloClient ページが表示されます。

サーブレットを表示するブラウザウィンドウのスクリーンショット

「ファイル」ウィンドウでプロジェクトを見ると、target ディレクトリに MavenHelloWebClient.war アーカイブが含まれていることがわかります。WAR を展開すると、MavenHelloServiceAPI JAR がアーカイブに含まれていないことがわかります。

OSGi バンドルの配備および配備取り消し

このチュートリアルでは、ターミナルで deploy コマンドを使用してバンドルを GlassFish サーバーに配備する方法について説明します。この節では、undeploy コマンドを使用して GlassFish サーバー上で OSGi バンドルの配備を取り消す方法について説明します。また、OSGi バンドルをサーバーにコピーして配備する方法、およびバンドルを削除して配備を取り消す方法についても説明します。

undeploy コマンドの使用

deploy コマンドを実行したときには、type パラメータを使用して OSGi を指定しました。このコマンドを実行したとき、OSGi バンドルは、GlassFish サーバーの <GLASSFISH-INSTALL>/glassfish/domains/domain1/applications ディレクトリにコピーされました。たとえば、MavenHelloService-1.0-SNAPSHOT.jar のバンドルの配備を取り消すには、ターミナルで次のコマンドを入力します。

<glassfish-install>/glassfish/bin/asadmin undeploy MavenHelloService-1.0-SNAPSHOT

OSGi バンドルのコピーによる配備

デフォルトでは、GlassFish サーバーの autodeploy/bundles ディレクトリにコピーされたすべての OSGi バンドルが自動的に配備されます。たとえば、コピーコマンド (cp など) を使用して、OSGi バンドル JAR を <GLASSFISH-INSTALL>/glassfish/domains/domain1/autodeploy/bundles ディレクトリにコピーできます。

cp /Users/nb/Documents/nbproject/MyOSGiBundle/target/MyOSGiBundle-1.0-SNAPSHOT.jar modules/autostart 

JAR をディレクトリにコピーすると、「出力」ウィンドウに次のような出力が表示されます。

INFO: Installed /Applications/NetBeans/glassfishv3/glassfish/modules/autostart/MyOSGiBundle-1.0-SNAPSHOT.jar
INFO: Started bundle: file:/Applications/NetBeans/glassfishv3/glassfish/modules/autostart/MyOSGiBundle-1.0-SNAPSHOT.jar

autostart ディレクトリを見ると、JAR が格納されていることがわかります。

削除コマンド (rm など) を使用して、JAR を autostart ディレクトリから削除できます。JAR を削除すると、「出力」ウィンドウに次のような出力が表示されます。

INFO: Uninstalled /Applications/NetBeans/glassfishv3/glassfish/domains/domain1/autodeploy/bundles/MavenHelloService-1.0-SNAPSHOT.jar

リファレンスおよび参照情報

このチュートリアルで説明されている概念の一部についての詳細は、次のドキュメントが役に立つ場合があります。



関連項目

NetBeans IDE および Maven を使用して OSGi バンドルを開発する方法についての詳細は、次のリソースを参照してください。

nbj2ee メーリングリストに登録する ことによって、NetBeans IDE Java EE 開発機能に関するご意見やご提案を送信したり、サポートを受けたり、最新の開発情報を入手したりできます。