Given a class, how to retrieve its bundle?

OSGI R4.2 (thus Equinox 3.5) comes (well, will come, since the spec. is not final yet) with a new simple and handy utility: the org.osgi.framework.FrameworkUtil.getBundle(Class) static method, which allows to retrieve the bundle a given class belongs to.

More specifically, this method will give you the bundle who loaded the given class, or null if the class has not been loaded by the OSGi framework (e.g. if it is a class belonging to the boot classpath…).

Thus, whenever you want to access information such as the version of a bundle, its headers,  etc. without having to query its Activator (perhaps you don’t even have an Activator for this bundle…), you know what you’ve got to use! Of course, whoever says Bundle, means BundleContext, and this handy helper is also very convenient to easily publish/consume OSGi services on behalf of the bundle… 🙄

9 thoughts on “Given a class, how to retrieve its bundle?”

  1. Very nice tip.

    Do you know how to get the information which packages are exported by the bundle? Is there also a method to get the corresponding bundle for a selected project?

    By the way the WP-Cumulus plug-in is cool!

  2. I have used ((BundleReference)getClass().getClassLoader()) directly until now. Thanks to inform us, that there is a framework method to do that now.

    I have also adjusted my code assist templates like:
    bundle
    ${imp:import(org.osgi.framework.FrameworkUtil)}
    FrameworkUtil.getBundle(getClass())${cursor}

    For bundle and bc (bundleContext) import the templates from here:
    http://pastebin.com/m3b4a1ef1

  3. Yeah the 3d-cloud plugin here is very cool. Is the source for it available? Would be nice to have it in my Eclipse app 🙂

  4. @Lars

    > Do you know how to get the information which packages are exported by the bundle?

    You need to use the PackageAdmin service. Get a PackageAdmin service reference the way you like most (using a ServiceTracker, Declarative Services, or whatever) and you will then be able to call PackageAdmin#getExportedPackages(Bundle)!

    > Is there also a method to get the corresponding bundle for a selected project?
    You need to use PDE core API, and call o.e.pde.core.plugin.PluginRegistry#findModel(IProject).

Leave a Reply

Your email address will not be published. Required fields are marked *