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
- Add your third party-non OSGi jars to module.
- Build the module.
- Open MANIFEST.MF file and extract Import-Package header list.
- 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.*,\
\
*
|
buy custom boxes for your products to deliver to your valuable customers, The best thing is that DIY charges are free and also you can get delivery at your doorstep.
ReplyDeleteRegards for just a wonderful knowledge together with in all areas of your webblog, here are some is a touch ask for an internet site subscribers. Who also quotes down the page premium? . . . .Speak out delicately and in addition have a top staff; you’ll turn out some distance. small business websites
ReplyDelete