Java
gradle
Liferay
OSGi

Liferay 7 / DXPでサードパーティのライブラリを利用した際に、デプロイできない件の解決方法

サードパーティのライブラリを利用した際に、デプロイできない

実際の開発時に、build.gradleに新規ライブラリを追加して、いざLiferayにデプロイしようとすると、依存関係が解決できないので、デプロイできないよ、と言われることがあります。原因としては、jsonicライブラリ内で参照している他のライブラリに、optionalと指定されているためです。そうした推移的依存関係(transitive dependency)が自動的に解決できない場合は、自身で依存関係を解決するためのヒントを、build.gradlebnd.bndに書く必要があるのですが、以下にその方法を示します。

ツールチームのリードデベロッパーであるGreg Amersonが教えてくれた、このチケットLPS-76436を超訳したものになります。

以下ではexternal-lib-webというMVCポートレットを開発しているバンドルで、jsonicライブラリを利用しようとする例で説明します。

Step.1 bnd.bndファイルで、Conditional-packageを利用する。

build.gradle
 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"
 }
bnd.bnd
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.2 Private-package / Import-Packageで解決

build.gradle
 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"
 }
bnd.bnd
 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.3 それでもうまくいかない場合があったら・・・

その場合は、build.gradlecompileOnlyとなっている部分を、compileIncludeを利用し、Step2, Step3を組み合わせて試してみる、となります。

現在、ツールチームの方でLiferay用のGradleプラグインで、compileConditionalというようなものを開発中なので、それが組み込まれると、推移的依存関係(transitive dependency)はcompileConditionalでまず解決を試みる、という方法になります。