oo

パッケージのインポート

他のモジュールで提供されている機能が必要になることはよくあります。 この機能にアクセスするには、他のモジュールから自分のモジュールのクラスパスにパッケージをインポートする必要があります。 このためには、これらの他のモジュールが、必要な機能を含むパッケージをすでにエクスポートしている必要があります。 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か所(ビルドスクリプト)だけだからです。

note

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のクラスも含まれます)。

note

プラグインWARプロジェクトの場合、LiferayのWABジェネレータは、WARのJSP、記述子ファイル、およびクラス( WEB-INF/classesおよび埋め込みJAR)で使用されるパッケージを検出します。 また、WABジェネレータは、web.xmlliferay-web.xmlportlet.xmlliferay-portlet.xml、および liferay-hook.xml記述子ファイルを検索します。 プラグインの WEB-INF/classesフォルダにも埋め込みJARにも見つからないクラスのパッケージインポートを追加します。

手動パッケージインポート

モジュールが次の場所でのみクラスを参照する場合は、パッケージインポートを手動で追加する必要があります。

  • 認識されない記述子ファイル
  • カスタムまたは認識されない記述子要素または属性
  • リフレクションコード
  • クラスローダーコード

パッケージを手動でインポートする方法は次のとおりです。

  1. モジュールのbnd.bndファイルを開きます。

  2. Import-Packageヘッダを追加します。

  3. パッケージをヘッダのパッケージリストに追加します。

Import-Package: [... existing package list,][add the package here]
note

プラグイン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アーティファクトに対してコンパイルする場合、パッケージのコントラクト要件がモジュールのマニフェストに追加されます。

note

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))

  これで、モジュールで使用するすべての種類のパッケージをインポートできるようになりました。

関連トピック

Feature: