Liferay Development

Liferay Consulting

Liferay Training

Your Trusted Liferay Solutions Partner

Thursday, March 12, 2020

Unrelated packages Unresolved requirement Import-Package Error in Liferay OSGi Module Framework

When we started using third-party non-OSGi jars, we can see Unresolved requirement: Import-Package” error for the packages but those packages we may not use directly in the current developing module (unrelated packages). This is due to third-party jar transitive dependencies.

If we use compileInclude scope for third-party dependencies for gradle build type module then it will add all its transitive dependencies packages as part of “Import-Package” list during build process.

Example Error


org.osgi.framework.BundleException: Could not resolve module: com.liferaysavvy.employee.portlet [1080]
  Unresolved requirement: Import-Package: com.graphbuilder.curve


Solution:

We can ignore packages using Import-Package header in module bnd.bnd file or we can add specified missing package jar as third party non OSGi jar.

Ignore Packages as follows.

Example

Import-Package: \
!com.graphbuilder.*,\
!com.github.luben.zstd.*,\
!com.github.luben.zstd.*,\
!com.microsoft.schemas.*,\
!net.sf.saxon.*,\
!org.apache.batik.*,\
!org.apache.jcp.xml.dsig.internal.*,\
!org.bouncycastle.asn1.*,\
!org.bouncycastle.*,\
!org.bouncycastle.cms.*,\
!org.brotli.dec.*,\
!org.etsi.uri.*,\
!org.openxmlformats.schemas.*,\
!org.tukaani.xz.*,\
!com.zaxxer.sparsebits.*,\
!org.apache.commons.codec.*,\
!org.apache.commons.collections4.*,\
!org.apache.commons.compress.*,\
!org.apache.commons.math3.*,\
!org.apache.xmlbeans.*,\
!org.w3.x2000.*,\
\
*

If we override the “Import-Package” header in the bnd.bnd file, we should add \ * end of list otherwise it will ignore all Liferay default packages during the build process.  Don’t forget this and if you missed, it will lead to so many unresolved requirement errors.

Before ignoring packages, we must check whether package is really can be ignorable or not. If the package is really unrelated to module then we can ignore it but we need to verify thoroughly after deployment.  If the non-OSGi third party jar and its dependencies is required by module then add it to the module.


Unresolved Import-Package can be only identified after module deployment and it will display only one Unresolved Import-Package for each time and it wont show all at once. Assume if we have 10 Unresolved Import-Packages then we have to deploy module for 10 times to know these 10 Unresolved Import-Packages.  This is very pain point for developer for initial phase of module development. This scenario can be experienced when we are trying to use third party non-OSGi jars in the module.

We can see these Unresolved Import-Package error in console during the deployment of module or we can use Gogo shell to see the error and package.

You can use following Gogo shell command to know the reason


diag [BUNDLE_ID]





Lets take the example, if you are trying add apache poi libraries to the module then we may have to ignore many unrelated packages in the Import-Package of bnd.bnd file. To identify these unrelated packages, we may have to build and deploy modules for several times. These packages we may not use directly in the module.

Ignore Packages as follows.

Example


Import-Package: \
!com.graphbuilder.*,\
!com.github.luben.zstd.*,\
!com.github.luben.zstd.*,\
!com.microsoft.schemas.*,\
!net.sf.saxon.*,\
!org.apache.batik.*,\
!org.apache.jcp.xml.dsig.internal.*,\
!org.bouncycastle.asn1.*,\
!org.bouncycastle.*,\
!org.bouncycastle.cms.*,\
!org.brotli.dec.*,\
!org.etsi.uri.*,\
!org.openxmlformats.schemas.*,\
!org.tukaani.xz.*,\
!com.zaxxer.sparsebits.*,\
!org.apache.commons.codec.*,\
!org.apache.commons.collections4.*,\
!org.apache.commons.compress.*,\
!org.apache.commons.math3.*,\
!org.apache.xmlbeans.*,\
!org.w3.x2000.*,\
\
*


Tip to Identify Unrelated/Ignorable packages

  1. Add your third party-non OSGi jars to module.
  2. Build the module.
  3. Open MANIFEST.MF file and extract Import-Package header list.
  4. Identify the all unrelated packages and ignore it in the bnd.bnd file.

Add your third party-non OSGi jars to module

If you think that your module required third-party non-OSGi jars and add it the module.


Take the example of apache poi libraries.

Build the module

Build the module using your build tool MAVEN or GRADLE

Open MANIFEST.MF file and extract Import-Package header list

Once module build is success it will generate jar file and output files in build directory.

MAVEN we can see these generated files in Target directory in the parent directory of module.


Gradle we can see these generated files in build directory in the parent directory of module




Open MANIFEST.MF file after build. You can use JD-GUI java de-compiler to see files in jar file.



If you are using MAVEN you can see MANIFEST file in classes directory. Extract the Import-Package header package list in editor


Identify the all unrelated packages and ignore it in the bnd.bnd file.

Identify all the unrelated packages to current module from extracted text. Don’t add any Liferay or module specific packages in the ignore list.

Add packages to module bnd.bnd file as ignorable packages. We may see following ignorable packages when we are trying to add apache poi libraries.

Example:


Import-Package: \
!com.graphbuilder.*,\
!com.github.luben.zstd.*,\
!com.github.luben.zstd.*,\
!com.microsoft.schemas.*,\
!net.sf.saxon.*,\
!org.apache.batik.*,\
!org.apache.jcp.xml.dsig.internal.*,\
!org.bouncycastle.asn1.*,\
!org.bouncycastle.*,\
!org.bouncycastle.cms.*,\
!org.brotli.dec.*,\
!org.etsi.uri.*,\
!org.openxmlformats.schemas.*,\
!org.tukaani.xz.*,\
!com.zaxxer.sparsebits.*,\
!org.apache.commons.codec.*,\
!org.apache.commons.collections4.*,\
!org.apache.commons.compress.*,\
!org.apache.commons.math3.*,\
!org.apache.xmlbeans.*,\
!org.w3.x2000.*,\
\
*


This may help you to find all ignorable packages at one time and can avoid number of build deployments to find Unresolved Import-Packages. 

0 comments :

Post a Comment

Recent Posts

Recent Posts Widget

Popular Posts