OSGiサービスの使用
Liferay APIは、OSGiサービスとしてすぐに利用できます。 サービスにアクセスするには、そのサービス タイプのフィールドを作成し、そのフィールドに @Referenceという注釈を付けます。次に例を示します。
@Reference
BlogsEntryService _blogsEntryService;
上記の _blogsEntryService フィールドは、 BlogsEntryService OSGi サービスにアクセスします。
すべての宣言型サービス コンポーネント ( @Componentで注釈が付けられたクラス) は、この方法で OSGi サービスにアクセスできます。 ランタイムフレームワークは、コンポーネントの@Referenceのアノテーションが付いたフィールドにサービスタイプを挿入します。
次の例は、Greeterと呼ばれるOSGiサービスの使用を示しています。 3つのモジュールは、OSGiサービスで使用されるAPI-Provider-Consumerパターンを示しています。
- API モジュールは、
Greeterサービス タイプを定義します。 - 実装モジュール は
Greeterサービスを提供します。 - サンプルモジュール は
Greeterサービスを消費します。
サンプルモジュールクラスは、Greeterサービスを使用してパーソナライズされた挨拶を返すGogo シェルコマンドを作成します。 この例を OSGi サービスの “Hello World” として考えてみましょう。

OSGiサービスは任意のJavaクラスで使用できます。
Liferay サービスの Javadoc は こちらから入手できます。
OSGi サービスを作成する方法については、 OSGi サービスとしての APIを参照してください。
Gogo シェルコマンドの例をデプロイする
新しい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-j1h1.zipをダウンロードして解凍します。curl https://resources.learn.liferay.com/examples/liferay-j1h1.zip -Ounzip liferay-j1h1.zip -
サンプルモジュールをデプロイします。
cd liferay-j1h1./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq) -
Dockerコンテナコンソールでデプロイを確認します。
STARTED com.acme.j1h1.api_1.0.0 STARTED com.acme.j1h1.impl_1.0.0 STARTED com.acme.j1h1.osgi.commands_1.0.0 -
Gogo Shellを開きます。
-
Gogo シェルコマンドフィールドに、
j1h1:greetコマンドを入力して、挨拶を生成します。j1h1:greet "Captain Kirk" -
出力を確認します。
Hello Captain Kirk!
この例のモジュールは、APIおよび実装モジュールを利用して、j1h1:greet Gogo シェルコマンドから返されるコンテンツを生成します。
OSGiサービスの使用方法
ビジネスロジックの作成
クラスでは、必要なOSGiサービスを使用してビジネスロジックを実装します。
- サービスをインポートします。
import com.acme.j1h1.Greeter;
- サービスを使用します。
public void greet(String name) {
_greeter.greet(name);
}
private Greeter _greeter;
上記のメソッドは、Greeterのgreetメソッドを呼び出します。 com.acme.j1h1.Greeterは、実装モジュールが登録するOSGiサービスタイプです。 クラスは、OSGiサービスレジストリからGreeterインスタンスを取得する必要があります。
外部サービスリファレンスの注釈
レジストリから OSGi サービスを取得するには、そのサービス タイプのフィールドに @Reference アノテーションを追加する必要があります。 @Referenceをサービスフィールドに追加します。
@Reference
private Greeter _greeter;
J1H1OSGiCommandsクラスには、_greeterと呼ばれる上記のプライベートGreeterフィールドがあります。 @Referenceアノテーションは、レジストリからのGreeterサービスをフィールドに挿入するようにOSGiランタイムに指示します。 J1H1Greeterがレジストリ内で最も一致するGreeterサービスコンポーネントである場合(この例ではこれが唯一の一致です)、ランタイムは_greeterにJ1H1Greeterを挿入します。
クラスをコンポーネントにする
@Referenceアノテーションを使用できるのは、Declarative Servicesコンポーネントのみです。 @Componentアノテーションをクラスに追加し、service属性を使用して、コンポーネントが特定のサービスを実装していることを宣言します。
@Component(
property = {"osgi.command.function=greet", "osgi.command.scope=j1h1"},
service = J1H1OSGiCommands.class
)
public class J1H1OSGiCommands {
J1H1OSGiCommandsクラスは、独自のタイプのOSGiサービスを提供します。 2つのプロパティは、j1h1というスコープでgreet というコマンド関数を使用してGogoシェルコマンドを定義します。 デプロイされたJ1H1OSGiCommandsコンポーネントは、Stringを入力として受け取るGogo シェルコマンドj1h1:greetを提供します。
APIへの依存関係を追加する
コンシューマモジュールはAPIに依存します。 build.gradleファイルで、依存関係にAPIを追加します。 j1h1-osgi-commandsモジュールのbuild.gradleファイルは次のとおりです。
dependencies {
compileOnly group: "com.liferay.portal", name: "release.portal.api"
compileOnly project(":j1h1-api")
}
release.portal.apiアーティファクトは、モジュールが現在のLiferay製品リリースから必要とするLiferay、Bnd、およびOSGiサービスを提供します。 [project root]/gradle.propertiesファイルのliferay.workspace.productは、リリースを指定します。
ローカルプロジェクトj1h1-apiはGreeterサービスを提供するため、j1h1-osgi-commandsはアーティファクトではなくプロジェクトとしてそのサービスに依存できます。 外部成果物への依存関係の指定 も簡単です。
さいごに
APIモジュールとImplモジュールは、それぞれGreeterサービスを定義および提供しました。 例のj1h1-osgi-commandsモジュールは、サービスを使用して単純なGogo シェルコマンドを作成します。 API-Provider-Consumer契約によって疎結合が促進され、ソフトウェアの管理、拡張、およびサポートが容易になります。
隣接するプロジェクトからOSGiサービスを使用することに慣れてきたので、外部アーティファクトからOSGiサービスを使用することを検討してみましょう。 依存関係の構成 では、モジュールを見つけて依存関係として構成する方法を示します。