Fundamentals
ご覧のページは、お客様の利便性のために一部機械翻訳されています。また、ドキュメントは頻繁に更新が加えられており、翻訳は未完成の部分が含まれることをご了承ください。最新情報は都度公開されておりますため、必ず英語版をご参照ください。翻訳に問題がある場合は、 こちら までご連絡ください。

APIs as OSGi Services

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

Liferayは、API、実装、およびクライアントをコンポーネントとして公開します。 OSGi 宣言型サービス (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.132-ga132

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

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

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

    curl https://resources.learn.liferay.com/examples/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 Shellに移動します。

  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

パッケージエクスポート は、 Greeter インターフェースを他のモジュールと共有します。

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 サービスの使用で実証されています。