Technologies

Déployer automatiquement vos applications avec Apache Karaf

Publié le : Auteur: Jean-Yves BESSON Laisser un commentaire
karaf-logo_lg

Lors des phases de développement par itération il est parfois long et pénible de redéployer les binaires produits à chaque compilation vers les environnements de tests ou de recette.

Dans cet article je vous propose découvrir le framework Apache Karaf qui est une alternative intéressante à des solutions plus lourdes (type Jenkins, Ansible, Docker, etc…) pour déployer vos applications depuis vos repository Maven en mode ‘devops’.

Découverte, installation et prise en main

Apache Karaf est ce que l’on appelle un ‘conteneur d’applications’, c’est-à-dire une application dont le but est d’embarquer et de gérer le cycle de vie d’autre applications. Il peut gérer des jars classiques mais également des jars répondants à la spécification OSGI, appelés ‘bundle’ qui contiennent les informations permettant de démarrer ou arrêter les services applicatifs et de gérer les dépendances.

Une fois téléchargé depuis le site officiel et démarré on accède à la console de Karaf qui va nous donner accès aux commandes permettant de manipuler nos ‘bundle’ :

Capture

Dans la suite de cet article nous allons créer un bundle très simple affichant ‘Hello World’ et le déployer dans Karaf.

Création d’un bundle OSGI ‘Hello World’

Pour exposer un service au sein d’un bundle OSGI il faut implémenter un Activator, une classe qui contient les deux méthodes de gestion du service en fonction du contexte d’exécution :

public class KarafDemoActivator implements BundleActivator {

    public void start(final BundleContext context) throws Exception {
        System.out.println("Hello World !");
    }

    public void stop(final BundleContext context) throws Exception {
        System.out.println("Bye Bye World !");
    }
}

Cet activator sera découvert puis exploité par le conteneur (Karaf) en fonction des commandes de son administrateur.

Pour finaliser notre bundle nous allons devoir ajouter un peu de paramétrage Maven dans le pom.xml de notre projet :

  • Un packaging de type ‘bundle’
  • Une dépendance vers OSGI core (en scope provided, car sera fournie par le conteneur)
  • Une compilation via un plugin Maven dédié qui utilisera Apache Felix pour générer le bundle en utilisant des paramètres spécifiques.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>fr.sodifrance</groupId>
    <artifactId>karafbundledemo</artifactId>
    <version>1.0.0-SNAPSHOT</version>

    <packaging>bundle</packaging>

    <dependencies>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.core</artifactId>
            <version>4.2.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    
    <build>        
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <version>2.3.7</version>
                <extensions>true</extensions>
                <configuration>
                    <instructions>
                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
                        <Bundle-Version>${project.version}</Bundle-Version>
                        <Bundle-Activator>fr.sodifrance.karafdemo.KarafDemoActivator</Bundle-Activator>
                    </instructions>
                </configuration>
            </plugin>
        </plugins>
    </build>
    
</project>

Installation et exploitation depuis le repository Maven

Une fois notre bundle compilé et son jar présent dans le repository Maven, nous pouvons l’installer dans Karaf via la commande :

bundle:install -s mvn:fr.sodifrance/karafbundledemo/1.0.0-SNAPSHOT

Karaf démarre alors automatiquement l’application, lui assigne une clé, et on voit l’instruction ‘Hello Word !’ apparaitre dans la console :

Capture2

De nombreuses commandes (start, stop, list, etc…) très utiles sont disponibles et il est possible d’en créer de nouvelles.

Ajout du mode de surveillance

Pour terminer, nous allons placer Karaf en surveillance sur notre repository Maven pour qu’il soit prévenu de toute mise à jour via la commande :

bundle:watch 160

Capture3

Depuis notre poste de développement modifions alors l’activator en remplaçant le message ‘Hello World !’ par ‘Hello New World !’ et relançons le build maven :

Capture4

Karaf arrête l’ancienne instance du bundle, réinstalle et relance la nouvelle version : notre solution de déploiement automatique est opérationnelle !

Conclusion

Au prix du développement d’un activator et d’un peu de paramétrage via Maven, nous avons obtenu une solution de déploiement automatique et d’administration efficace.

Bien entendu le framework Karaf ne se limite pas à cela et fournit une multitude de fonctionnalités intéressantes, comme par exemple ses interactions avec d’autres frameworks comme Camel, CXF ou encore Hadoop.

Pour ceux qui souhaitent aller plus loin avec OSGI et la modularité en Java, je vous invite à vous intéresser au projet Jigsaw, prévu pour le JDK9, qui reprend une bonne partie de ces concepts.

Références

http://karaf.apache.org/

https://www.osgi.org/

http://openjdk.java.net/projects/jigsaw/