パッケージのインポート
他のモジュールで提供されている機能が必要になることはよくあります。 この機能にアクセスするには、他のモジュールから自分のモジュールのクラスパスにパッケージをインポートする必要があります。 このためには、これらの他のモジュールが、必要な機能を含むパッケージをすでにエクスポートしている必要があります。 OSGiフレームワークは、パッケージをインポートするモジュールのクラスパスに接続します。 モジュールJARのMETA-INF/MANIFEST.MF
ファイルは、Import-Package
OSGiヘッダを使用してパッケージをインポートします。
Import-Package: javax.portlet,com.liferay.portal.kernel.util
パッケージのインポートは手動で指定する必要がある場合がありますが、必ずしもそうではありません。 便利なことに、ワークスペースベースのモジュールプロジェクトは、必要なパッケージを自動的に検出し、それらをモジュールマニフェストのパッケージインポートリストに追加します。 パッケージのインポートは手動で指定する必要がある場合があります。
2つの異なるパッケージインポートのシナリオがあります。
これらのシナリオでパッケージのインポートがどのように指定されるかについては、以下をお読みください。
パッケージの自動インポート
ワークスペース-チュートリアルの例にあるプロジェクト( モジュールプロジェクトを参照)、または Blade CLI や Liferay Developer Studio で作成したものを Bnd で使用します。 GradleプラグインはBndを呼び出し、BndはGradleの依存関係を読み取り、インポートを解決できます。 プロジェクトのJARをビルドすると、Bndはモジュールが使用するパッケージを検出し、META-INF/MANIFEST.MF
ファイルを生成し、パッケージをImport-Package
ヘッダに割り当てます。 その意味で、パッケージのインポートは自動的に行われます。なぜなら、依存関係を定義する必要があるのは、1か所(ビルドスクリプト)だけだからです。
Liferayのプロジェクトテンプレートは、 サードパーティのGradleプラグイン を使用してBndを呼び出します。
たとえば、 Gogoコマンドサンプル のbuild.gradle
は、com.liferay.portal.kernel
およびorg.osgi.service.component.annotations
のパッケージを使用します。 サンプルのbuild.gradle
ファイルは次のとおりです。
dependencies {
compileOnly group: "com.liferay.portal", name: "com.liferay.portal.kernel"
compileOnly group: "org.osgi", name: "org.osgi.service.component.annotations"
}
BndがサンプルJARのMETA-INF/MANIFEST.MF
ファイルで生成するImport-Package
ヘッダは次のとおりです。
Import-Package: com.liferay.portal.kernel.service;version="[4.3,5)"
ビルドファイルは依存関係を指定します。 Bndは、モジュールのクラスパスを調べて、モジュールが使用するパッケージをインポートします。 検査には、クラスパスで見つかったすべてのクラスが含まれます(埋め込まれたサードパーティライブラリJARのクラスも含まれます)。
プラグインWARプロジェクトの場合、LiferayのWABジェネレータは、WARのJSP、記述子ファイル、およびクラス( WEB-INF/classes
および埋め込みJAR)で使用されるパッケージを検出します。 また、WABジェネレータは、web.xml
、liferay-web.xml
、 portlet.xml
、liferay-portlet.xml
、および liferay-hook.xml
記述子ファイルを検索します。 プラグインの WEB-INF/classes
フォルダにも埋め込みJARにも見つからないクラスのパッケージインポートを追加します。
手動パッケージインポート
モジュールが次の場所でのみクラスを参照する場合は、パッケージインポートを手動で追加する必要があります。
- 認識されない記述子ファイル
- カスタムまたは認識されない記述子要素または属性
- リフレクションコード
- クラスローダーコード
パッケージを手動でインポートする方法は次のとおりです。
モジュールの
bnd.bnd
ファイルを開きます。Import-Package
ヘッダを追加します。パッケージをヘッダのパッケージリストに追加します。
Import-Package: [... existing package list,][add the package here]
プラグインWARプロジェクトにパッケージを手動でインポートするには、上記のような Import-Package
ヘッダをプロジェクトのWEB-INF/liferay-plugin-package.properties
ファイルに追加します。
Java APIパッケージ
JavaポートレットなどのJava APIのパッケージは、セマンティックにバージョン管理されていませんが、 ポータブルJavaコントラクト があります。 各APIのコントラクトは、それが満たすJSRを指定します。 これらのAPIを使用するモジュールは、APIコントラクトの要件を指定する必要があります。 コントラクト要件は、インポートされたAPIパッケージとのモジュールの関係を定義します。 実行しているシステムが正確なコントラクトを提供 しない 場合、モジュールは解決されません。 欠落しているパッケージを解決するほうが、実行中の非互換性の失敗を処理するよりもましです。
ワークスペースベースのプロジェクトは、ポータブルJavaコントラクトを自動的に指定します。 たとえば、モジュールがJavaポートレットAPIを使用し、Javaポートレット2.0アーティファクトに対してコンパイルする場合、パッケージのコントラクト要件がモジュールのマニフェストに追加されます。
WARプロジェクトはBndを使用せず、 WEB-INF/liferay-plugin-package.properties
ファイルでコントラクトを指定する必要があります。 たとえば、JavaPortlet
2.0に指定されたコントラクトは次のとおりです:Import-Package: javax.portlet Require-Capability: osgi.contract;filter:=(&(osgi.contract=JavaPortlet)(version=2.0))
これで、モジュールで使用するすべての種類のパッケージをインポートできるようになりました。