モジュールプロジェクト
Liferayのアプリケーションやカスタマイズは、 OSGi モジュール : .jar
ファイルで、Javaコードと、APIを公開・消費するための追加設定が含まれています。
モジュールプロジェクトは、次の3つから構成されています。
コード: Javaクラスと、画像、テンプレート、追加の記述子などのリソース。 Javaパッケージはデフォルトではプライベートですが、他のモジュールが使用できるようにエクスポートすることができます。
ビルドスクリプト: モジュールをビルドしてデプロイするための Gradle ファイル。
メタデータ: Bnd ファイルは、モジュールのアーティファクトを定義し、モジュールが提供するまたは必要とするパッケージや機能を指定します。
モジュールプロジェクトの構造は次のとおりです。
[project root]
└── [module 1]
│ ├── bnd.bnd // Defines the module artifact, provided/required capabilities, and more
│ ├── build.gradle // Declares dependencies
│ └── src
│ └── main
│ ├── java
│ │ └── [Java packages]
│ └── resources
│ └── [Images, templates, descriptors, etc.]
│
└── [module 2]
│
└── [module n]
│
├── gradle
│ └── [Gradle wrapper files]
├── gradlew // Invokes the Gradle wrapper to execute tasks
├── gradlew.bat
├── gradle.properties // Specifies the Liferay product version
└── settings.gradle // Applies Gradle plugins
Liferayでは、一般的に3種類のモジュールを使用します。
API モジュールはインターフェイスを定義します。
実装 モジュールは、インターフェイスを実装する具象クラスを提供します。
クライアント モジュールはAPIを消費します。
Gogo シェルでユーザーが名前を入力したときにあいさつ文を表示する簡単なコマンドを開発することで、それぞれを作成する方法を学習します。
ここでは、APIを作成し、モジュールプロジェクトの各部分について学習し、モジュールをデプロイして、ランタイム時にモジュールを検査します。 次の2つのチュートリアルでは、実装モジュールとクライアントモジュールを作成します。
まず、サンプルのAPIモジュールプロジェクトをデプロイします。
シンプルなモジュールのデプロイ
サンプルモジュールでは、あいさつ文を生成するための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_に変更します。
次に、以下の手順を実行します。
サンプルをダウンロードし、解凍します。
curl https://resources.learn.liferay.com/dxp/latest/en/liferay-internals/fundamentals/liferay-k8s2.zip -O
unzip liferay-k8s2.zip
モジュールのJARをビルドします。
cd liferay-k8s2
./gradlew jar
The JAR file is generated to the module’s
build/libs
folder.k8s2-api/build/libs/com.acme.k8s2.api-1.0.0.jar
モジュールのJARをデプロイします。
./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
ログメッセージには、LiferayがJARを処理してモジュールを起動していることが示されます。
Processing com.acme.k8s2.api-1.0.0.jar STARTED com.acme.k8s2.api_1.0.0 [1152]
STARTED
のメッセージには、モジュールのID1152
が含まれています。Gogo シェルを開きます。
Gogo シェルのコマンド欄に
lb
と入力すると、モジュールのIDなどの情報が表示されます。 最後に追加されたモジュールが最後に表示されます。 モジュール名のキーワードがわかっていれば、grep
で探すことができます。lb | grep -i "k8s2"
出力:
1152|Active | 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, Status=ACTIVE Data Root=[Liferay Home]/osgi/state/org.eclipse.osgi/1152/data "No registered services." No services in use. Exported packages com.acme.k8s2; version="1.0.0"[exported] No imported packages No fragment bundles No required bundles
このモジュールはアクティブで、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
モジュールの構造を、プロジェクトルートのコンテキストで示したものです。
[project root]
└── k8s2-api
│ ├── bnd.bnd
│ ├── build.gradle
│ └── src
│ └── main
│ └── java
│ └── com/acme/k8s2
│ └── Greeter.java
│
└── [Gradle files]
k8s2-api
モジュールフォルダには、bnd.bnd
メタデータファイル、 build.gradle
スクリプト、およびJavaコードが含まれています。
コードを書く
サンプルモジュールには、Greeter
という名前のJavaクラスが1つしかありません。
@ProviderType
public interface Greeter {
public void greet(String name);
}
@ProviderType
アノテーションは、そのインターフェイスを実装しているものがそれを提供することをサービスレジストリに伝えます(すなわちGreeter
)。 インターフェイスの greet
という1つのメソッドは、 String
を要求し、何も返しません。
モジュールの src/main/java
フォルダと src/main/resources
フォルダに、それぞれ独自のJavaコードとリソースを追加します。
依存関係の指定
build.gradle
ファイルでは、モジュールの依存関係を指定します。
dependencies {
compileOnly group: "com.liferay.portal", name: "release.portal.api"
}
これは、LiferayリリースのAPI JARという1つのアーティファクトに依存しています。 これは、Liferay製品のリリースに関連するLiferay、Bnd、OSGiのアーティファクトを詰め込んだ大きなJARです。
[project root]/gradle.properties
ファイルでは、 liferay.workspace.product
プロパティで製品のリリースを指定しています。
liferay.workspace.product=portal-7.4-ga86
最後に、依存性のあるバージョンはありません。 これは、ワークスペースがリリースに関連するLiferay製品のAPIバージョンを適用するためです。
詳細については、 依存関係の構成 を参照してください。
メタデータの指定
モジュールJARの META-INF/MANIFEST.MF
ファイルには、モジュールの説明が書かれています。 マニフェストには、マニフェストヘッダーと呼ばれるプロパティが含まれ、モジュールがエクスポート/インポートするパッケージや、モジュールが提供/要求する機能を指定します。 ビルドインフラストラクチャーがBndを提供しているので、モジュールの bnd.bnd
ファイルにいくつかの初期ヘッダーを指定するだけで済みます 。 Bndは、モジュールの検査に基づいて他のほとんどの値を生成します。
初期のメタデータ
bnd.bnd
ファイルは、モジュールの説明と設定を行います。
Bundle-Name: Acme K8S2 API
Bundle-SymbolicName: com.acme.k8s2.api
Bundle-Version: 1.0.0
Export-Package: com.acme.k8s2
モジュールの名前は Acme K8S2 API である。シンボリック名—一意性を保証する名前—はcom.acme.k8s2.api
である。次にsemantic versionを宣言する。最後に、モジュールは com.acme.k8s2
という Java パッケージを exports して、他のモジュールからパッケージを利用できるようにします。上記のパッケージのエクスポートは、b [bundle 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))"
Tool: Bnd-4.3.0.201909301554
Bndはbnd.bnd
ファイルからすべてのヘッダーをプロパゲートし、さらにヘッダーと詳細を追加しました。 例えば、エクスポートされたcom.acme.k8s2
パッケージには、デフォルトのパッケージバージョン1.0.0
があります。
まとめ
これで完了です。 ご覧の通り、モジュールプロジェクトは他のJavaプロジェクトと同じですが、いくつかの設定が追加されています。
これで、モジュールプロジェクトがどのようなものか、ビルドしてデプロイする方法、そしてランタイム時にモジュールを検査する方法をマスターしました。
モジュールは、Greeter
APIのようなAPIを介して、互いの機能を活用します。 LiferayはOSGiサービスを使用して、APISを定義、実装、消費します。 次に、 OSGiサービスとしてのAPI で、OSGiサービスを使用したGreeter
APIの 実装 について説明します。
モジュールのライフサイクルの詳細については、モジュールのライフサイクルを参照してください。