Chaque bundle de mon projet OSGi a son propre BundleActivator, ce qui, je pense, est normal. Cela obtient passé le BundleContext actuel, qui est utile d'avoir autour pour obtenir des références de service et ainsi de suite.
Cependant, à partir des classes de mon bundle, comment puis-je obtenir le BundleContext? L'affecter à un champ statique public dans BundleActivator est nul et le passer comme argument est également nul. Existe-t-il un moyen plus intelligent?
Vous pouvez utiliser FrameworkUtil.getBundle(ClassFromBundle).getBundleContext()
.
Voir FrameworkUtil JavaDoc .
À mon avis, une bonne pratique lors du développement de bundles OSGi est d'essayer d'écrire le code associé à OSGi de manière aussi centralisée que possible. De cette façon, si vous souhaitez utiliser votre code dans un environnement non OSGi, l'effort de migration est minimal.
Par conséquent, utiliser des références statiques ou FrameworkUtil partout n'est pas une bonne idée à mon humble avis. Ni l'un ni l'autre n'utilise OSGi ordinaire. Essayez de regarder iPOJO ou les services déclaratifs.
Une autre alternative consiste à utiliser les services déclaratifs, qui vous permettent de recevoir le BundleContext dans votre méthode d'activation. Par exemple, en supposant que vous utilisez les annotations Bnd pour DS:
@Activate
public void activate(BundleContext context) {
// ...
}
Cependant, comme l'a dit RaduK, il est beaucoup mieux si vous pouvez écrire la majorité de votre code dans un style POJO sans utiliser les API OSGi telles que BundleContext.