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 。
http://localhost:8080でLiferayへのサインインします。 メールアドレス test@liferay.com とパスワード test を使用してください。 プロンプトが表示されたら、パスワードを learn に変更します。
次に、以下の手順に従って、サンプルモジュールを起動します:
-
liferay-p9g2.zipをダウンロードして解凍する。curl https://resources.learn.liferay.com/dxp/latest/en/liferay-internals/fundamentals/liferay-p9g2.zip -Ounzip liferay-p9g2.zip -
プロジェクトのルートフォルダから、モジュールをデプロイします。
cd liferay-p9g2./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq) -
Dockerコンテナコンソールでモジュールの起動を確認します。
STARTED com.acme.p9g2.api_1.0.0 STARTED com.acme.p9g2.impl_1.0.0 -
http://localhost:8080に移動して、サインインします。 -
Gogo シェルに移動します。
-
lbGogo シェルコマンドを使用してモジュール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 -
次のコマンドを実行し、番号をモジュールの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 export は 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サービスの使用 で説明しています。