Vous êtes ici

Démarrage avec OSGi

logoosgi.gif 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 :

  • créer un projet plug-in s'appelant OSCARExample1, via le menu File / New / Other... / Plug-in Project
  • laisser les valeurs par défaut pour les champs autres que le nom de projet, dans la boîte de dialogue qui s'est affichée
  • cliquer sur Next
  • pour Plug-in Class / Class Name, indiquer tutorial.example1.Activator, et décocher This plug-in will make contributions to the UI
  • cliquer sur Finish
  • ouvrir le fichier source Activator.java qui a été créé
  • effacer le contenu, et le remplacer par le code source de l'exemple OSCAR :
    /*
     * 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.");
            }
        }
    }
    
  • sauver le fichier (CTRL-S)
  • ouvrir un terminal, et aller dans le répertoire 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)
  • passer la commande suivante :
    jar cfm example1.jar META-INF/MANIFEST.MF -C src tutorial/example1
    
  • dans un autre terminal, passer la commande suivante, pour lancer OSGi :
    java -jar /home/pascalb/eclipse/plugins/org.eclipse.osgi_3.1.1.jar -console
    
  • entrer alors les commandes suivantes
    launch                       # pour lancer le framework OSGi
    install file:/home/pascalb/workspace/OSCARExample1/example1.jar
                                 # pour installer notre bundle exemple
                                 # remplacer par 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

12/07/2007 - un didacticiel récent

Grand merci à Benjamin pour le pointeur sur un didacticiel clair!

01/08/2007 - Divers

Une présentation de l'utilisation de log4j.

La liste complète des articles, suite de la présentation trouvée par Benjamin.