Missing package in Import-Package causes NoClassDefFoundError at runtime
------------------------------------------------------------------------
Key: FELIX-2918
URL: https://issues.apache.org/jira/browse/FELIX-2918
Project: Felix
Issue Type: Bug
Components: Maven Bundle Plugin
Affects Versions: maven-bundle-plugin-2.3.4
Environment: OSX Snow Leopard, Maven3, Java6, Guice/Peaberry
Reporter: Yuri
Priority: Minor
I have an issue where I get a NoClassDefFoundError while starting my
multi-project bundles. This exception is thrown while Peaberry is creating an
proxy for a multiple() import. Aside from the Peaberry specifics, the
multiple() import is loading the service interface, it's implementation and
dependencies until it hits this error. After taking a closer look and comparing
the bundle giving me grief to another similar (wrt dependencies) one that was
working fine, I noticed two differences in the Manifest: a missing package in
the Import-Package and the same package missing from the uses directive in the
Export-Package. Basically, maven-bundle-plugin was not "seeing" the missing
package when auto generating the manifest.
The scenario, in more detail, is as follows.
Bundle A (the one with the missing package in the manifest) imports packages
from bundle E:
BUNDLE A (package a):
--------
interface a.AS extends e.ES<a.AS,a.AW>{}
interface a.AW extends e.EW<a.AS,a.AW>{}
BUNDLE E (packages e and b):
--------
interface e.EW<S extends e.ES<S,W>, W extends e.EW<S,W>> extends b.AD, b.AH{}
interface b.AD{} // THIS IS THE NoClassDefFoundError CLASS
interface b.AH{}
I then ran my mvn3 build with maven-bundle-plugin v2.3.4 and attached a
debugger to it. I then stopped in the aQute.lib.osgi.Analyzer line
1684 (t.addAll(clazz.getReferred());) for class a.AS. I was expecting
to see packages a (for a.AS and the two generic parameters a.AS and
a.AW, which happens to be in the same package), e (for e.ES interface,
and the two generic parameters a.ES and e.EW, which happens to be in
the same package) and b (b.AD and b.AH). However, I didn't see the
package b there.
So it seems that BND is not analyzing dependencies of dependencies and the
reason my other module worked was because there was an unrelated, direct
dependency to package b somewhere else, forcing the package to be added to the
Manifest.
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira