サードパーティのライブラリを利用した際に、デプロイできない
実際の開発時に、build.gradle
に新規ライブラリを追加して、いざLiferayにデプロイしようとすると、依存関係が解決できないので、デプロイできないよ、と言われることがあります。原因としては、jsonic
ライブラリ内で参照している他のライブラリに、optional
と指定されているためです。そうした推移的依存関係(transitive dependency)が自動的に解決できない場合は、自身で依存関係を解決するためのヒントを、build.gradle
とbnd.bnd
に書く必要があるのですが、以下にその方法を示します。
ツールチームのリードデベロッパーであるGreg Amersonが教えてくれた、このチケットLPS-76436を超訳したものになります。
前提条件
- Liferay Workspaceを利用している。
- Lifeay Workspaceの
modules
以下にプロジェクトファイルを作成している。 - external-lib-webというMVCポートレットを開発しているバンドルで、
jsonic
ライブラリを利用しようとする例で説明します。
Step.1 blade gw resolve
を実行してみる。
該当のプロジェクトでblade gw resovle
を実行してみると、依存性が解決できていないファイルが表示されるはずです。それでまず依存しているファイルの目星をつけましょう。
Step.2 bnd.bnd
ファイルで、Conditional-package
を利用する。
dependencies {
compileOnly group: "com.liferay.portal", name: "com.liferay.portal.kernel", version: "2.0.0"
compileOnly group: "com.liferay.portal", name: "com.liferay.util.taglib", version: "2.0.0"
compileOnly group: "javax.portlet", name: "portlet-api", version: "2.0"
compileOnly group: "javax.servlet", name: "javax.servlet-api", version: "3.0.1"
compileOnly group: "jstl", name: "jstl", version: "1.2"
compileOnly group: "org.osgi", name: "osgi.cmpn", version: "6.0.0"
compileOnly group:"net.arnx", name:"jsonic", version:"1.3.10"
}
Bundle-Name: external-lib-web
Bundle-SymbolicName: com.liferay.sample.test.external.library
Bundle-Version: 1.0.0
Export-Package:\
com.liferay.sample.test.external.library.constants
Conditional-Package: net.arnx.jsonic.*
Step.3 Private-packag
e / Import-Package
で解決
dependencies {
compileOnly group: "com.liferay.portal", name: "com.liferay.portal.kernel", version: "2.0.0"
compileOnly group: "com.liferay.portal", name: "com.liferay.util.taglib", version: "2.0.0"
compileOnly group: "javax.portlet", name: "portlet-api", version: "2.0"
compileOnly group: "javax.servlet", name: "javax.servlet-api", version: "3.0.1"
compileOnly group: "jstl", name: "jstl", version: "1.2"
compileOnly group: "org.osgi", name: "osgi.cmpn", version: "6.0.0"
compileOnly group:"net.arnx", name:"jsonic", version:"1.3.10"
}
Bundle-Name: external-lib-web
Bundle-SymbolicName: com.liferay.sample.test.external.library
Bundle-Version: 1.0.0
Export-Package:\
com.liferay.sample.test.external.library.constants
Import-Package:\
!com.google.inject
Private-Package:\
net.arnx.jsonic
Step.4 それでもうまくいかない場合があったら・・・
その場合は、build.gradle
でcompileOnly
となっている部分を、compileInclude
を利用し、Step2, Step3を組み合わせて試してみる、となります。
現在、ツールチームの方でLiferay用のGradleプラグインで、compileConditional
というようなものを開発中なので、それが組み込まれると、推移的依存関係(transitive dependency)はcompileConditionalでまず解決を試みる、という方法になります。