OSGI R4.2 (donc Equinox 3.5) introduit une nouveauté toute bête, mais particulièrement pratique. Il s’agit de la méthode org.osgi.framework.FrameworkUtil.getBundle(Class), qui permet de récupérer le bundle auquel appartient une classe donnée.
Plus précisément, cette méthode vous renverra le bundle qui a servi à résoudre ladite classe, ou null dans le cas où la classe n’a pas été chargée par le Framework (si c’est une classe du boot classpath par exemple…).
Ainsi, dès qu’il s’agira de récupérer des infos comme le numéro de version d’un bundle, ses headers, etc… sans avoir à passer par l’Activator (qui parfois n’existe d’ailleurs même pas…), vous savez ce qu’il vous restera à faire! En outre, qui dit Bundle, dit BundleContext, et cette méthode est donc également un moyen très simple de publier/consommer des services !.. 🙄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 replies on “Retrouver le bundle auquel appartient une classeGiven a class, how to retrieve its bundle?”
You can use the PackageAdmin too! 🙂
Yup of course but in 3.5 I find it more direct to use this new thing 😉
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!
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
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 🙂
@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 callPackageAdmin#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)
.@Philip
> Yeah the 3d-cloud plugin here is very cool. Is the source for it available?
If you download the “Developer version” there, http://wordpress.org/extend/plugins/wp-cumulus/download/ you’ll get the sources! 🙂
Thank you Benjamin.
Wow – finally, we can retrieve the bundle a class belongs to, after years of “you can’t touch this” (see http://wiki.eclipse.org/FAQ_How_do_I_locate_the_owner_plug-in_from_a_given_class%3F). Is hell freezing over?
At any rate, this is great news and I assume many people will be glad to exploit this feature. Let’s hope they use it wisely.