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に変更します。
次に、次の手順に従ってサンプル モジュールを起動します。
-
liferay-p9g2.zipをダウンロードして解凍します。curl https://resources.learn.liferay.com/examples/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 Shellに移動します。
-
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
パッケージエクスポート は、 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 サービスの使用で実証されています。