Développement OSGi pour serveur Karaf – Part 1

image_pdfimage_print

Ce post est le premier d’une série concernant le développement d’applications OSGi pour Apache Karaf. Apache Karaf est un conteneur OSGi (basé sur Equinox ou Felix au choix).

karaf-logo

Les caractéristiques intéressantes de Apache Karaf sont :

  • Console type bash avec complétion (peut être étendue par chaque bundle)
  • Console de connexion SSH
  • Déploiement de Bundle ou Feature à partir d’une repository maven
  • Création dynamique et facile d’instances filles en ligne de commande

L’ensemble de ces caractéristiques rendent l’utilisation d’un serveur d’application OSGi aussi simple que celle d’une application standalone Java. Le déploiement et la gestion des applications dans Apache Karaf sont beaucoup plus simples et pratiques que la plupart des serveurs déjà rencontrés. En ajoutant à cela que ce serveur est relativement léger, je pense que Apache Karaf est une solution combinant la facilité de développement d’une application J2EE et d’une application standalone utilisant Spring.

Outils :

Allez, c’est parti !

La première partie se contentera de créer le projet Eclipse contenant le minimum vital, de configurer la génération du bundle et de l’installer sur notre serveur Karaf.

Partie 1 : Projet karaf-spout

Partie 1 : Projet karaf-spout

Dans Eclipse créer un nouveau projet de type Maven avec les paramètres suivants :

  • groupId : fr.conceptit.tuto
  • artifactId : karaf-spout
  • version : 0.0.1-SNAPSHOT

eclipse-projet

Partie 2 : Définition d’un Activator

Dans le dossier src/main/java :

  • création d’un package “fr.conceptit.tuto.spout”
  • Création d’un fichier Activator.java avec le code suivant
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class Activator implements BundleActivator {
    @Override
    public void start(BundleContext context) {
        System.out.println("(^_^).oO(Starting spout bundle)");
    }

    @Override
    public void stop(BundleContext context) {
        System.out.println("(-_-).oO(Stopping spout bundle)");
    }
}

Cette classe permettra d’intercepter le démarrage et l’extinction de notre bundle. Cela permettra soit de monitorer soit de déclencher des actions sur des services.

Partie 3 : Création du bundle

Dans le fichier POM.xml, nous allons définir les informations permettant de créer un bundle pour karaf :

  • packaging doit être du type bundle
  • Nous allons ajouter une dépendance pour l’Activator:
    <dependency>
    	<groupId>org.osgi</groupId>
    	<artifactId>org.osgi.core</artifactId>
    	<version>4.2.0</version>
    	<scope>provided</scope>
    </dependency>
    
  • Dans la liste de plugin a utiliser nous allons mettre maven-bundle-plugin avec les informations suivantes :
<plugin>
	<groupId>org.apache.felix</groupId>
	<artifactId>maven-bundle-plugin</artifactId>
	<version>2.3.7</version>
	<extensions>true</extention>
	<configuration>
		<instructions>
			<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
			<Bundle-Version>${project.artifactId}</Bundle-Version>
			<Bundle-Activator>fr.conceptit.tuto.spout.Activator</Bundle-Activator>
		</instructions>
	</configuration>
</plugin>
  • Une fois la configuration faite, nous allons générer le bundle avec la commande classique :
    • mvn -U clean install

Partie 4 : Rendez vous dans karaf

Une fois la précédente commande exécutée vous avez dû voir “BUILD SUCCESS” apparaître.
Donc nous allons maintenant installer notre bundle dans Karaf.

Pour se faire :

  • Décompressez le zip de Apache Karaf
  • Entrez dans le dossier généré, direction le dossier “bin”
  • Lancez le serveur avec l’exécutable “karaf”

Vous obtenez un serveur lancé avec la fenêtre suivante :

karaf-1

  • Pour installer notre bundle nous n’avons qu’une ligne à saisir :
#osgi:install -s mvn:[groupId]/[artifactId]/[version]
osgi:install -s mvn:fr.conceptit.tuto/karaf-spout/0.0.1-SNAPSHOT
  • Le résultat devrait être celui la :

karaf-2

  • si nous voulons stopper et relancer ou encore désinstaller notre bundle il suffit de faire un osgi:stop / osgi:start / osgi:uninstall avec l’ID du bundle :karaf-3

Partie 5 : Dynamiser son développement

Quand on veut développer avec Apache Karaf, une commande peut s’avérer très pratique :

dev:watch

En effet, cette dernière permet de demander au serveur de surveiller la repository maven et de mettre à jour le bundle ou les bundles lorsque ces derniers sont régénérés.

Il faut savoir que, par défaut, Apache Karaf est à l’écoute de votre repository maven local configuré par votre setting.xml.

L’utilisation la plus simple dans le cadre de dev est de démarrer son karaf et de taper la commande :

dev:watch *

Avec le wildcard “*”, dev:watch se met à l’écoute de tout les bundles dont l’uri se compose de mvn:* et comportent -SNAPSHOT.

A chaque fois que vous ferez un mvn clean install de votre projet vous obtiendrez quelque chose du genre :

[Watch Updating watched bundle: [votre_projet] ([votre_version])

Voici un exemple de résultat :
karaf-4

Conclusion de cette partie

Créer un projet de bundle pour karaf n’est pas plus compliqué que ça !

Une configuration minimum d’Eclipse, de même pour maven et quelques lignes de commande dans le serveur Karaf suffiront à mettre en route un projet fonctionnel.

Pour le moment, notre application n’est pas ce qu’on peut appeler utile ! Par la suite, nous verrons comment il est possible d’utiliser cette plateforme pour mettre en place un flow de traitement de fichiers avec framework orienté EIP, processus d’insertion en base et reporting par l’intermédiaire de web services.

Au final, mettre en place un cluster de Karaf dans le but de se rapprocher au plus prêt d’une infrastructure professionnelle, serait très pratique.

6 comments

  1. La partie 2 de cet article est disponible…

  2. […] de la première partie du tuto “Développement OSGI pour serveur Karaf“, nous avions vu que le serveur Apache Karaf avait un certains nombres de qualités […]

  3. Olivier says:

    Bonjour,

    Je vous remercie pour votre post très interessant.

    Cependant en essayant de reproduire vos explications je rencontre un problème au moment où les valeurs de l’activator doivent s’afficher dans la console Karaf.

    En effet je vois bien l’id du bundle s’afficher, dans la web console je vois que le bundle est démarré mais pas de (^_^).oO(Starting spout bundle.

    Auriez vous l’explication ?

    Merci.

    • Pierre-Yves says:

      Bonjour,

      Avez vous regarder les logs de karaf (disponible au dans [home_karaf]/data/log/karaf.log) ? Peut être y a t’il une info qui pourrait m’aider à vous répondre.
      Cependant, je ne voix que deux problèmes possibles :

      La classe héritant d’Activator
      La définition de l’Activator au niveau du plugin maven-bundle-plugin

      Je vous propose de m’envoyer votre projet sous forme de zip à l’adresse suivante : pnicolas@conceptit.fr. Je me ferrai un plaisir de vous aider.

      • olivier says:

        Tout d’abord je vous remercie de la rapidité de votre réponse.

        Ensuite j’ai réussi à résoudre le problème ce matin même. J’ai supprimé Karaf retéléchargé et recommencer exactement la même procédure et la console m’a affiché immédiatement ce que je désirai.

        Et encore une fois mille merci pour votre post qui m’a été fort utile.

Leave a Reply

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