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.86-ga86。
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 -O
unzip 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 シェルに移動します。
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
次のコマンドを実行し、番号をモジュールの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サービスの使用 で説明しています。