Wednesday, March 11, 2020

Unresolved requirement Import-Package Error in Liferay OSGi Module Framework

When we are developing Liferay OSGi modules, we can see “Unresolved requirement Import-Package Error” while deploying modules. This is very common error we can encounter in deployment of modules and finally module will not be in active state but it’s in installed state.

org.osgi.framework.BundleException: Could not resolve module: com.liferaysavvy.employee.portlet [3218]_  Unresolved requirement: Import-Package: [Sanitized]
       at org.eclipse.osgi.container.Module.start(
       at org.eclipse.osgi.internal.framework.EquinoxBundle.start(
       at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundle(
       at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundles(
       at org.apache.felix.fileinstall.internal.DirectoryWatcher.doProcess(
       at org.apache.felix.fileinstall.internal.DirectoryWatcher.process(

You can use following Gogo shell command to know the reason

diag [BUNDLE_ID]

Reason for the Error

The package that Liferay OSGi Module used in “Import-Package” list was not exported by any of the other module in the Liferay OSGi module framework.

The following are two fundamental things to understand above error.

  1. When you use any package in module “Import-Package” list, specified package must be Exported by other module in Liferay OSGi module framework.
  2. If the other module was not exported the package already then it should be in module “Private-Package” list.

When you use any package in module “Import-Package” list, specified package must be Exported by other module in Liferay OSGi module framework.

Usually we use “Import-Package” header in MANIFEST file list all packages that required by module. Liferay OSGi module uses the bnd.bnd file to specify the MANIFEST headers and bnd tools will finally update the configuration in module MANIFEST.MF file in the build process.

Even if we are not specifying any packages explicitly in the “Import-Package” list in bnd.bnd file, bnd tools will add packages for “Import-Package” header during the build time. Bnd tools are very smart enough to find all packages that module uses will be added in “Import-Package” header. You can notice it in jar file MANIFEST.MF

Usually exported packages will be defined in “Export-PackageMANIFEST.MF header. If its custom Liferay OSGi module, Export-Package header can be used in bnd.bnd file.

Usually Packages will be exported at different level in Liferay OSGi Module Framework.

  1. Global Packages exported by Liferay Module Framework
  2. Liferay Portal Bootstrap module exported system extra packages
  3. Developer Developed custom OSGi modules.

To understand Global Exported and Liferay Bootstrap Exported packages follow the below blog.

Developer Developed custom OSGi modules

If the package belongs to one of your custom Liferay OSGi module then use “Export-Package” header in module bnd.bnd file.

Example: bnd.bnd file

Export-Package: com.liferaysavvy.employee.portlet.constants

If any package the module is using or listed in “Import-Package” list was exported by any one of above procedure then package must be resolved.

If the other module was not exported that package already then it should be in module “Private-Package” list.

If the module required package was not exported already in the above procedure then we can see same error. When we use some third-party jars in the modules then we can expect the same error.

Solution: 1

If the module required package is from third party library then we need to find OSGi compliance version of same jar and deploy in Liferay Module Framework. Newer version of third-party libraries are OSGi compliance.

How to identify the JAR is OSGi compliance?

Check MANIFEST.MF file with OSGi headers.

Example: latest google gson-2.8.6.jar is OSGi compliance

How to deploy OSGi compliance third-party library into OSGi module framework?

Simply place the jar file in Liferay portal bundle “osgi/module directory. In the logs you can see Module STARTED statement.  

Solution: 2

If the jar was not found as OSGi compliance jar then use includeresource option. Includeresource option will add jar to module lib directory and add packages in the private package list.

Follow the below blog to add third party non-OSGi jars to Liferay OSGi module.


Post a Comment

Recent Posts

Recent Posts Widget

Popular Posts