Cela fait maintenant plusieurs mois que j'ai l'envie de mettre les mains dans OSGi.
J'ai un peu de temps, alors je m'y mets...
Le site officiel est ici.
Parmi les implémentations d'OSGi disponibles en logiciel libre, on peut citer :
Equinox étant une implémentation de la release 4 d'OSGi, c'est elle que nous allons utiliser.
Equinox est en fait la base sur laquelle sont implémentés le client riche Eclipse (RCP) et l'IDE Eclipse.
Sur le T2-R sous Mandriva 2006, Eclipse 3.1.1 étant installé, la commande suivante lance OSGi :
java -jar /home/pascalb/eclipse/plugins/org.eclipse.osgi_3.1.1.jar -console
Les spécifications d'OSGi R4 sont disponibles sur le site d'OSGi.
Le site d'Oscar propose d'une part des bundles, d'autre part quelques exemples de code source. Le site de Knopflerfish présente plusieurs pages permettant de découvrir OSGi.
L'aide en ligne de l'API OSGi est disponible sur le site Eclipse. Le premier exemple de bundle OSGi avec lequel nous allons jouer est tiré du site Oscar.
Dans Eclipse, suivre la procédure suivante :
OSCARExample1
, via le menu File / New / Other... / Plug-in Project
Next
Plug-in Class / Class Name
, indiquer tutorial.example1.Activator
, et décocher This plug-in will make contributions to the UI
Finish
Activator.java
qui a été créé/* * OSGi and Gravity Service Binder tutorial. * Copyright (c) 2003 Richard S. Hall * http://oscar-osgi.sourceforge.net **/ package tutorial.example1; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceListener; import org.osgi.framework.ServiceEvent; /** * This class implements a simple bundle that utilizes the OSGi * framework's event mechanism to listen for service events. Upon * receiving a service event, it prints out the event's details. **/ public class Activator implements BundleActivator, ServiceListener { /** * Implements BundleActivator.start(). Prints * a message and adds itself to the bundle context as a service * listener. * @param context the framework context for the bundle. **/ public void start(BundleContext context) { System.out.println("Starting to listen for service events."); context.addServiceListener(this); } /** * Implements BundleActivator.stop(). Prints * a message and removes itself from the bundle context as a * service listener. * @param context the framework context for the bundle. **/ public void stop(BundleContext context) { context.removeServiceListener(this); System.out.println("Stopped listening for service events."); // Note: It is not required that we remove the listener here, // since the framework will do it automatically anyway. } /** * Implements ServiceListener.serviceChanged(). * Prints the details of any service event from the framework. * @param event the fired service event. **/ public void serviceChanged(ServiceEvent event) { String[] objectClass = (String[]) event.getServiceReference().getProperty("objectClass"); if (event.getType() == ServiceEvent.REGISTERED) { System.out.println( "Ex1: Service of type " + objectClass[0] + " registered."); } else if (event.getType() == ServiceEvent.UNREGISTERING) { System.out.println( "Ex1: Service of type " + objectClass[0] + " unregistered."); } else if (event.getType() == ServiceEvent.MODIFIED) { System.out.println( "Ex1: Service of type " + objectClass[0] + " modified."); } } }
OSCARExample1
(créé par défaut dans le répertoire workspace
dans le répertoire utilisateur, si rien d'autre n'a été précisé au lancement d'Eclipse)jar cfm example1.jar META-INF/MANIFEST.MF -C src tutorial/example1
java -jar /home/pascalb/eclipse/plugins/org.eclipse.osgi_3.1.1.jar -console
launch # pour lancer le framework OSGi install file:/home/pascalb/workspace/OSCARExample1/example1.jar # pour installer notre bundle exemple # remplacerpar la bonne valeur - OSGi retourne un identifiant de bundle, par exemple 3, à utiliser dans les commandes suivantes
- démarrer le bundle :
start 6- et voilà !!
Pour info, le contenu de MANISFEST.MF généré par Eclipse est le suivant :
Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: OSCARExample1 Plug-in Bundle-SymbolicName: OSCARExample1 Bundle-Version: 1.0.0 Bundle-Activator: tutorial.example1.Activator Bundle-Localization: plugin Require-Bundle: org.eclipse.core.runtime Eclipse-AutoStart: true
Grand merci à Benjamin pour le pointeur sur un didacticiel clair!
Une présentation de l'utilisation de log4j.
La liste complète des articles, suite de la présentation trouvée par Benjamin.