After looking up a resource on the classpath, I got this URL:
bundleresource://23.fwk1186515174/com/google/inject/Injector.class
How can I find out in which bundle provided the resource?
[EDIT] I’m trying to debug a problem where I have duplicate classes on the classpath. Here is the code I’m using:
private void debugClassPath() {
String resource = "com/google/inject/Injector.class";
try {
Enumeration<URL> urls = getClass().getClassLoader().getResources( resource );
while( urls.hasMoreElements() ) {
System.out.println(urls.nextElement());
}
System.out.println("---");
urls = XtextRunner.class.getClassLoader().getResources( resource );
while( urls.hasMoreElements() ) {
System.out.println(urls.nextElement());
}
} catch( IOException e ) {
e.printStackTrace();
}
}
That gives me several URLs for com.google.inject.Injector and I want to figure out which bundles add them to the classpath.
OSGi urls guarantee the hierarchy. So just replace
com/google/inject/Injector.classwithMETA-INF/MANIFEST.MFand read the resource as a manifest (or text file). The information in there tells you which bundle you’re looking at.Duplicate classes can ONLY happen with split packages which is considered bad (very bad imho) practice. In OSGi, split packages require
Require-Bundlewith re-export orBundle-Classpath. Life is a lot easier without these …