I want to get all jar paths that I can search .class file in these jars. I wrote a function to search all the jars under App main folder but encountered a problem — some jar bundles are existed but out of date and not used by OSGi, ex. xxxx_1.0.0.jar and xxxx_1.2.0.jar are both existed, but only 1.2.0 are used by OSGi. If I search in main folder, are of them will be in the result list.
So is there a way to get all the jar files which used by OSGi? Then I can filter out the jar files which not used.
Thanks
Added:
I tried to use this way to get all the Bundles absolute URL, but failed:
StringBuffer sb = new StringBuffer();
Bundle[] bundles = com.ibm.director.services.storage.debugtool.Activator.context.getBundles();
for (Bundle bundle : bundles) {
java.net.URL url = bundle.getClass().getProtectionDomain().getCodeSource().getLocation();
sb.append("File:" + url.getFile() + ", Path:" + url.getPath() + "\n");
}
But hundred times of following output repeated:
File:/opt/ibm/director/lwi/runtime/core/eclipse/plugins/org.eclipse.osgi_3.4.3.R34x_v20081215-1030-RCP20120203-1500.jar
File:/opt/ibm/director/lwi/runtime/core/eclipse/plugins/org.eclipse.osgi_3.4.3.R34x_v20081215-1030-RCP20120203-1500.jar,
File:....
The number of used bundle is: 588, it might be correct, and we can get absolute Bundles path from the API but why they are all the same? How can I get the real path?
BundleContext#getBundles()gives you all bundles. You can then compare symbolic names and versions. However just because you have both xxxx_1.0.0.jar and xxxx_1.2.0.jar that doesn’t mean that xxx_1.0.0.jar is unused. There might be some other bundles present that require xxx_1.0.0.jar. Likewise just because a bundle isn’t started doesn’t mean it won’t be started later. You do not want to reimplement the OSGi resolver. If you want to clean up a repository I would suggest you use an application provided by the vendor of the repository like GC Application in p2.