モジュールプロジェクト
Liferay アプリケーションとカスタマイズは OSGi モジュール: .jar ファイルで、Java コードと API の公開および利用のための追加設定が含まれています。
モジュールプロジェクトは、次の3つから構成されています。
-
コード: Java クラスとリソース (画像、テンプレート、追加の記述子など)。 Javaのパッケージはデフォルトではprivateですが、他のモジュールから利用できるようにエクスポートすることもできます。
-
ビルドスクリプト: モジュールのビルドとデプロイのための Gradle ファイル。
-
メタデータ: Bnd ファイルはモジュール成果物を定義し、モジュールが提供および必要とするパッケージと機能を指定します。
モジュールプロジェクトの構造は次のとおりです。
[プロジェクトルート]
└── [モジュール 1]
│ ├── bnd.bnd // モジュールアーティファクト、提供/必須機能などを定義します
│ ├── build.gradle // 依存関係を宣言します
│ └── src
│ └── main
│ ├── java
│ │ └── [Java パッケージ]
│ └── resources
│ └── [画像、テンプレート、説明文など]
│
└── [モジュール 2]
│
└── [モジュール n]
│
├── gradle
│ └── [Gradle ラッパー ファイル]
├── gradlew // Gradle ラッパーを呼び出してタスクを実行します
├── gradlew.bat
├── gradle.properties // Liferay製品バージョンを指定します
└── settings.gradle // Gradleプラグインを適用します
Liferayでは、一般的に3種類のモジュールを使用します。
-
API モジュールはインターフェースを定義します。
-
実装 モジュールは、インターフェースを実装する具体的なクラスを提供します。
-
クライアント モジュールは API を利用します。
Gogo Shell でユーザーが名前を入力したときに挨拶する簡単なコマンドを開発することで、それぞれを作成する方法を学びます。

ここでは、APIを作成し、モジュールプロジェクトの各部分について学習し、モジュールをデプロイして、ランタイム時にモジュールを検査します。 次の2つのチュートリアルでは、実装モジュールとクライアントモジュールを作成します。
まず、サンプルのAPIモジュールプロジェクトをデプロイします。
シンプルなモジュールをデプロイする
サンプルモジュールでは、あいさつ文を生成するための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 に変更してください。
次に、以下の手順に従ってください。
-
サンプルをダウンロードして解凍してください。
curl https://resources.learn.liferay.com/examples/liferay-k8s2.zip -Ounzip liferay-k8s2.zip -
モジュールJARをビルドします。
cd liferay-k8s2./gradlew jarJAR ファイルは、モジュールの
build/libsフォルダーに生成されます。k8s2-api/build/libs/com.acme.k8s2.api-1.0.0.jar -
モジュールJARをデプロイします。
./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)ログメッセージには、LiferayがJARファイルを処理し、モジュールを起動していることが示されています。
com.acme.k8s2.api-1.0.0.jar の処理中 開始 com.acme.k8s2.api_1.0.0 [1152]STARTEDメッセージにはモジュールの ID:1152が含まれています。 -
Gogo Shell を開きます。
-
Gogo Shell コマンドフィールドで、
lbを使用して、モジュールの ID を含む情報を表示します。 最も最近追加されたモジュールが最後に表示されます。 モジュール名にキーワードが含まれていることがわかっている場合は、grepでそれを検索できます。lb | grep -i "k8s2"出力:
1152|アクティブ|15|Acme K8S2 API (1.0.0)|1.0.0このモジュールのIDは
1152です。 -
bコマンドとモジュール ID を使用して、モジュールに関する詳細情報を表示します。b 1152出力:
com.acme.k8s2.api_1.0.0 [1152] Id=1152、ステータス=ACTIVE データルート=[Liferay Home]/osgi/state/org.eclipse.osgi/1152/data "登録されたサービスはありません。" 使用中のサービスはありません。 エクスポートされたパッケージ com.acme.k8s2; バージョン="1.0.0"[エクスポート済み] インポートされたパッケージはありません フラグメントバンドルはありません 必要なバンドルはありません
このモジュールはアクティブで、 com.acme.k8s2 という名前のパッケージをエクスポートします。
モジュールをインストールして有効化したので、その使い方を学ぶことができます。
モジュールの設定方法
ビルドインフラストラクチャをセットアップする
LiferayモジュールはGradleビルドインフラストラクチャで開発されます。 以下のGradleファイルはプロジェクトのルートフォルダにあります。
| ファイル | Description |
|---|---|
gradle/ | Gradleラッパーが含まれています |
gradlew[.bat] | タスクを実行するためにGradleラッパーを呼び出します |
gradle.properties | Liferayの製品バージョンを指定します |
settings.gradle | Liferay Workspace プラグインを含む Gradle プラグインを適用します。 |
サンプルプロジェクトの k8s2-api フォルダーのように、新しいサブフォルダーにモジュールを追加したり、新しい Liferay Workspace に作成したりできます。
プロジェクトルートのコンテキストにおける k8s2-api モジュールの構造は以下のとおりです。
[プロジェクトルート]
└── k8s2-api
│ ├── bnd.bnd
│ ├── build.gradle
│ └── src
│ └── main
│ └── java
│ └── com/acme/k8s2
│ └── Greeter.java
│
└── [Gradle ファイル]
k8s2-api モジュールフォルダには、 bnd.bnd メタデータファイル、 build.gradle スクリプト、および Java コードが含まれています。
コードを書く
サンプルモジュールには、 Greeter というインターフェースの Java クラスが 1 つだけ含まれています。
@ProviderType
public interface Greeter {
public void greet(String name);
}
@ProviderType アノテーションは、インターフェースを実装するものがそれを提供する(つまり、 Greeter )ことをサービスレジストリに伝えます。 インターフェースのメソッドは greet と呼ばれ、 String を要求し、何も返しません。
モジュールの src/main/java フォルダと src/main/resources フォルダに、それぞれ独自の Java コードとリソースを追加してください。
依存関係を指定する
build.gradle ファイルは、モジュールの依存関係を指定します。
dependencies {
compileOnly group: "com.liferay.portal", name: "release.dxp.api"
}
これは、LiferayリリースAPI JARという1つの成果物に依存しています。 これは、Liferay製品リリースに関連するLiferay、Bnd、およびOSGiのアーティファクトを詰め込んだ大きなJARファイルです。
[プロジェクト ルート]/gradle.properties ファイルでは、 liferay.workspace.product プロパティで製品リリースを指定します。
liferay.workspace.product=[$LIFERAY_LEARN_PORTAL_WORKSPACE$]
最後に、依存関係のバージョンはありません。 それは、Workspaceがリリースに関連付けられたLiferay製品のAPIバージョンを適用するためです。
詳細については、 依存関係の設定 を参照してください。
メタデータを指定する
モジュール JAR の META-INF/MANIFEST.MF ファイルはモジュールを記述します。 マニフェストには、モジュールがエクスポート/インポートするパッケージと、モジュールが提供/必要とする機能を指定するマニフェストヘッダーと呼ばれるプロパティが含まれています。 ビルドインフラストラクチャは Bnd を提供するため、モジュールの bnd.bnd ファイルでいくつかの初期ヘッダーを指定するだけで済みます。 Bndは、モジュールの検査に基づいてその他のほとんどの値を生成します。
初期メタデータ
bnd.bnd ファイルはモジュールを記述および構成します。
バンドル名: Acme K8S2 API
バンドルシンボル名: com.acme.k8s2.api
バンドルバージョン: 1.0.0
エクスポートパッケージ: com.acme.k8s2
モジュール名は Acme K8S2 API です。 そのシンボル名—は、一意性を保証する名前—であり、 com.acme.k8s2.api です。 次に、その セマンティックバージョン が宣言されます。 最後に、このモジュールは は Javaパッケージ「com.acme.k8s2」をエクスポートし、他のモジュールからこのパッケージを利用できるようにします。 b [バンドル ID] Gogo Shell コマンドを実行したときに、上記のパッケージのエクスポートを確認しました。
生成されたメタデータ
ビルド時に、Bnd は bnd.bnd ファイルからメタデータを JAR ファイルの META-INF/MANIFEST.MF に伝播し、その検査に基づいてメタデータを追加します。
以下は、サンプルモジュール用に生成された META-INF/MANIFEST.MF ファイルです。
Manifest-Version: 1.0
Bnd-LastModified: 1598968383025
Bundle-ManifestVersion: 2
Bundle-Name: Acme K8S2 API
Bundle-SymbolicName: com.acme.k8s2.api
Bundle-Version: 1.0.0
Created-By: 1.8.0_252 (Oracle Corporation)
Export-Package: com.acme.k8s2;version="1.0.0"
Javac-Debug: on
Javac-Deprecation: off
Javac-Encoding: UTF-8
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.8))"
ツール: Bnd-4.3.0.201909301554
Bnd は bnd.bnd ファイルからすべてのヘッダーを伝播し、さらにヘッダーと詳細を追加しました。 例えば、エクスポートされたパッケージ com.acme.k8s2 には、デフォルトのパッケージ バージョン 1.0.0 があります。
結論
それでおしまい! ご覧のとおり、モジュールプロジェクトは他のJavaプロジェクトとほぼ同じですが、いくつかの設定が追加されています。
これで、モジュールプロジェクトがどのようなものか、どのように構築およびデプロイするか、そして実行時にモジュールを検査する方法が理解できたでしょう。
モジュールは、 Greeter API のような API を介して互いの機能を活用します。 Liferayは、OSGiサービスを使用してAPIを定義、実装、および利用します。 次に、APIs as OSGi Servicesで、OSGiサービスを使用したGreeter APIの実装について説明します。
モジュールのライフサイクルの詳細については、 モジュールのライフサイクル を参照してください。