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:
org.apache.poi.ss.usermodel_ [Sanitized]
at
org.eclipse.osgi.container.Module.start(Module.java:444)
at
org.eclipse.osgi.internal.framework.EquinoxBundle.start(EquinoxBundle.java:428)
at
org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundle(DirectoryWatcher.java:1264)
at
org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundles(DirectoryWatcher.java:1237)
at org.apache.felix.fileinstall.internal.DirectoryWatcher.doProcess(DirectoryWatcher.java:520)
at
org.apache.felix.fileinstall.internal.DirectoryWatcher.process(DirectoryWatcher.java:365)
at
org.apache.felix.fileinstall.internal.DirectoryWatcher.run(DirectoryWatcher.java:316)
|
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.
- When you use any package in module “Import-Package” list, specified package must be Exported by other module in Liferay OSGi module framework.
- 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-Package” MANIFEST.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.
- Global Packages exported by Liferay Module Framework
- Liferay Portal Bootstrap module exported system extra packages
- 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.
Author
0 comments :
Post a Comment