oo

OSGiサービスとしてのAPI

モジュールとは何か、モジュールをデプロイする方法を学習したら、モジュールを使用してAPIを定義し、それらを実装できます。 Liferay APIは OSGiサービス であり、Javaインターフェースによって定義され、具体的なJavaクラスによって実装されます。

Liferayは、API、実装、およびクライアントをコンポーネントとして公開します。 OSGi Declarative Service (DS)アノテーションは、コンポーネントとそれらの関係を定義します。

  • @ProviderType は、コンポーネントが提供(実装)または消費できるインターフェースを定義します。
  • @Component は、クラスをコンポーネントとして宣言し、特定の機能を提供します。
  • @Reference は、別のコンポーネントをクラスメンバー(通常はフィールド)に関連付けます。

APIと実装に関する懸念事項を異なるモジュールに分離することができます。

  • API モジュールは、Javaインターフェースを使用して機能を 定義 します。 モジュールはインターフェースパッケージをエクスポートします。
  • 実装 モジュールは、具体的なJavaクラスを使用して機能を 提供 します。

ここでは、単純なgreeter OSGiサービスを作成するAPIと実装モジュールをデプロイします。 また、実装モジュールとそのJARを調べて、実装することでgreeterサービス機能がどのように提供されるかを学習します。 次のチュートリアルでは、クライアント— UIで呼び出せる部分を作成します。

シンプルなAPIと実装をデプロイする

新しいLiferay インスタンスを起動し、以下を実行します。

docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.112-ga112。

http://localhost:8080でLiferayへのサインインします。 メールアドレス test@liferay.com とパスワード test を使用してください。 プロンプトが表示されたら、パスワードを learn に変更します。

次に、以下の手順に従って、サンプルモジュールを起動します:

  1. liferay-p9g2.zip をダウンロードして解凍する。

    curl https://resources.learn.liferay.com/dxp/latest/en/liferay-internals/fundamentals/liferay-p9g2.zip -O
    
    unzip liferay-p9g2.zip
    
  2. プロジェクトのルートフォルダから、モジュールをデプロイします。

    cd liferay-p9g2
    
    ./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
    
  3. Dockerコンテナコンソールでモジュールの起動を確認します。

    STARTED com.acme.p9g2.api_1.0.0
    STARTED com.acme.p9g2.impl_1.0.0
    
  4. http://localhost:8080に移動して、サインインします。

  5. Gogo シェルに移動します。

  6. lb Gogo シェルコマンドを使用してモジュールIDを取得します。

    g! lb | grep -i "Acme P9G2"
    

    出力:

    1150|Active     |   15|Acme P9G2 API (1.0.0)|1.0.0
    1151|Active     |   15|Acme P9G2 Implementation (1.0.0)|1.0.0
    
  7. 次のコマンドを実行し、番号をモジュールのIDに置き換えて、実装モジュールのサービス機能を一覧表示します。

    g! inspect capability service 1195
    

    出力:

    com.acme.p9g2.impl_1.0.0 [1151] provides:
    -----------------------------------------
    service; com.acme.p9g2.Greeter with properties:
       service.id = 22933
       service.bundleid = 1151
       service.scope = bundle
       component.name = com.acme.p9g2.internal.P9G2Greeter
       component.id = 8462
    

Acme P9G2実装モジュールは、com.acme.p9g2.Greeterという1つのサービスを提供します。 component.nameプロパティは、モジュールのcom.acme.p9g2.internal.P9G2Greeterコンポーネントがサービスを実装していることを示しています。

P9G2GreeterコンポーネントがGreeterサービスを提供していることを確認しました。

次に、APIモジュールがどのようにgreeter機能を定義し、実装モジュールがどのようにgreeter機能をOSGiサービスとして提供するかを学習します。 まずはAPIの作成から始めます。

APIを作成する

APIは、次の2つのステップで作成します。

機能を定義する

サンプルのAPIモジュールのGreeterクラスはJavaインターフェースです。

@ProviderType
public interface Greeter {

@ProviderType アノテーションは、Greeterをコンポーネントが実装または消費できるタイプとして登録します。

greetメソッドは、入力としてStringという名前を取ります。

public void greet(String name);

Greeter機能が定義されています。

インターフェースパッケージをエクスポートする

APIモジュールのbnd.bndファイルは、モジュールを記述し、com.acme.p9g2インターフェースパッケージをエクスポートします。

Bundle-Name: Acme P9G2 API
Bundle-SymbolicName: com.acme.p9g2.api
Bundle-Version: 1.0.0
Export-Package: com.acme.p9g2

package exportGreeter インターフェイスを他のモジュールと共有します。

Greeter サービスタイプを実装して利用することができる。

実装の作成

サンプルの実装モジュールには Greeter 機能を提供する具象 Java クラスが含まれている。以下に実装の手順を示す。

コンポーネントアノテーションを追加する

P9G2Greeter クラスは Greeter インターフェースを実装する:

@Component(service = Greeter.class)
public class P9G2Greeter implements Greeter {

@Component アノテーションとそのservice = Greeter.class属性により、P9G2GreeterクラスはGreeterサービス・プロバイダーになります。

インターフェースを実装する

Greeterインターフェースは、voidの戻り値を持つメソッドgreet(String)を定義します。

@Override
public void greet(String name) {
	System.out.println("Hello " + name + "!");
}

greetメソッドの例では、指定された名前を使用して熱烈な挨拶文を出力します。

APIへの依存関係を追加する

実装モジュールのbuild.gradleファイルは以下のとおりです。

dependencies {
	compileOnly group: "com.liferay.portal", name: "release.portal.api"
	compileOnly project(":p9g2-api")
}

このファイルには、モジュールのGreeterクラスが必要なため、p9g2-apiモジュールプロジェクトへのコンパイル時の依存関係が含まれています。

モジュールのJARを調べる

p9g2-impl/build/libs/com.acme.p9g2.impl-1.0.0.jar実装モジュールJARをビルドしたとき、 Bnd はJARの/META-INF/MANIFEST.MFファイルを生成しました。

Bndがマニフェストで生成する主要なサービス関連のヘッダは次のとおりです。

Import-Package: com.acme.p9g2;version="[1.0,2)"

Import-Packageヘッダは、Greeterサービス定義を含むAPIモジュールのパブリックパッケージをインポートします。

Provide-Capability: osgi.service;objectClass:List<String>="com.acme.p9
 g2.Greeter";uses:="com.acme.p9g2"

Provide-Capabilityヘッダは、P9G2Greeterコンポーネントサービスを構成します。

Service-Component: OSGI-INF/com.acme.p9g2.internal.P9G2Greeter.xml

Service-Componentヘッダには、モジュールの各サービスコンポーネントの構成ファイル(.xml)が一覧表示されます。

モジュールをデプロイしたとき、サービスコンポーネントランタイムはP9G2GreeterサービスコンポーネントをGreeterサービスを提供するものとして登録しました。

まとめ

Greeterというサービス機能を 定義 し、P9G2Greeterというサービスコンポーネントで提供しました。 Greeterサービスが配置されました。 クライアントはどのようにサービスにアクセスして使用するのでしょうか。 これについては、 OSGiサービスの使用 で説明しています。

関連トピック

Feature: