avril 62011

Keystone : Bootstraping & Update

4 commentaires 2 annexes

tiredkitten.jpg

Un petit projet : keystone

Kezaco ?

keystone ou en français "clé de voute" à deux signification : Pierre en forme de coin qui maintient une voûte, Elément central dont tout dépend.

C'est un petit projet java qui est naît de la reprise de Winstone. Lors du refactoring, il est devenue important et nécessaire de simplifier le démarrage de ce serveur et de pouvoir embarquer facilement d'autre librairie dont le serveur dépend (comme une bonne API de log par exemple ...).
C'est comme ça que "keystone" est apparu, avec un petit clin d'oeil a "win" ou "stone" selon l'humeur du jour.

Amorce & Bootsrapping

Le bootstrapping est censé faire référence aux aventures du baron de Münchhausen, lequel se serait sorti d'un marécage où il était embourbé rien qu'en se tirant par les cheveux (plus précisément, sa queue de cheval) et se propulsant ainsi dans les airs. (source : http://fr.wikipedia.org/wiki/Bootstrap). En ce qui nous concerne c'est surtout un petit programme d'amorce.
Pour ceux qui ne connaisse pas du tout, je vous renvoie sur wikipedia.

Le principal intérêt pour nous c'est d'isoler les "classloader" de chaque partie applicative.
Pour ce faire je me suis inspirer de cet article qui vous donne les bases http://blog.markturansky.com/archives/21.

Mise à jour & Update

Le "plus" de ce projet, est la possibilité de mettre à jour de façon automatique votre application/serveur.
Connaissez vous le projet jdownloader ? C'est ce système de mise à jour que je vous propose : un site distant liste les mises à jour disponibles, et votre applicatif décide du "quand" (et même du "comment" si vous plongez un peu plus dans cette mécanique).
Les difficultés autour de cette fonctionnalité proviennent du fait que vous ne pouvez écrasez un "jar" qui est utilisé (il y a un verrou système sur ce fichier).
Ce qui implique de libérer les "jar" en cours d'utilisation avant de les mettre à jour. Nous avons donc besoin d'un petit utilitaire distinct de l'application principale, qui s'occupe de cette mise à jour.

Récupération depuis les sources

Récupération du code source et construction (client svn et maven obligatoire) :

svn checkout https://blog-intelligents-ia.googlecode.com/svn/trunk/keystone keystone --username yoursUserName
cd keystone
mvn clean package

Le projet se découpe en quatre partie :

  • le bootloader : keystone-boot,
  • une micro API de mise à jour : keystone-api,
  • l'utilitaire de mise à jour : keystone-update,
  • un exemple : keystone-sample,
  • un plugin maven pour que le build soit transparent : keystone-plugin

 

L'arborescence d'un projet

Lorsque que vous packagez votre application, vous allez obtenir une seule archive (jar). Celle-ci va contenir les dépendances de votre projet, les classes du "bootstrap", la configuration du boot, etc ...

Au démarrage cette archive va être extraite sur le système de fichier, en suivant cette arborescence (${home} étant le répertoire de démarrage) :

  • "${home}/lib" les dépendances de votre projet ainsi que l'archive de votre application,
  • "${home}/plugins" toutes les librairies qui peuvent être ajoutées de façon externe (manuellement, jar inclus dans un autre, téléchargement applicatif, ...),
  • "${home}/tools" les utilitaires comme l'"updater" (ce répértoire permet de façon simple la mise à jour du système)

 

Les options de démarrage

Voici la liste des option que vous pouvez passer au "Bootstrap" via la ligne de commande ( sous la forme "--name=value" ) ou par un fichier de propriétés ("keystone.properties").

La prise en compte des options suit la hiérarchie suivante (du plus important au moins important) :

  • ligne de commande sous la forme "--name=value"
  • le fichier "file:keystone.properties", au même niveau que l'archive
  • le fichier "classpath:keystone.properties"
  • le fichier "classpath:META-INF/keystone.properties"

 

NomDescription
Main-Classjava main class
  
BootStrap.haltOnErrortrue|false (par défaut : true), si vrai le système s'arrête à la première erreur, sinon il continue comme il peut (utile lors de mise à jour "tendue")
  
BootStrap.explodetrue|false (par défaut : true), si vrai, l'archive va être extraite dans le répertoire de démarrage (les répertoires "lib", "tools", et "plugins" vont être alimenté avec les ressources de l'archive de départ)
BootStrap.cleanUpToolstrue|false (par défaut : false), si vrai le répertoire 'tools' va être nettoyer au démarrage du système
BootStrap.cleanUpLibtrue|false (par défaut : true), si vrai le répertoire 'lib' va être nettoyer au démarrage du système
BootStrap.cleanUpPluginstrue|false (par défaut : false), si vrai le répertoire 'plugins' va être nettoyer au démarrage du système
  
BootStrap.verbosetrue|false (par défaut : false), active le mode de log 'verbose'
BootStrap.infotrue|false (par défaut : true), active le mode de log 'info'
BootStrap.logFilefichier de log du bootstrap (par défaut : aucun)
  
BootStrap.includeJavaHomeLibtrue|false (par défaut : false), inclus le répertoire de librairies du jdk dans le classpath 
BootStrap.includeSystemClassLoader true|false (par défaut : false), inclus le classloader système dans le classpath 
BootStrap.includePluginstrue|false (par défaut : true), inclus le répertoire des plugins dans le classpath

 

Le boot rajoute deux propriétés système pouvant être utiliser dans votre application :

  • BootStrap.location : le chemin complet de l'archive qui a été démarré via la ligne de commande
  • BootStrap.home : le répertoire de démarrage

 

 

Intégration du plugin à votre POM

 

  • Ajouter le repository du plugins
    <pluginRepositories>
        <pluginRepository>
            <id>intelligents-ia</id>
            <name>Intelligents-ia Repository</name>
            <url>http://intelligents-ia.com/maven2</url>
        </pluginRepository>
    </pluginRepositories>
    <repositories>
        <repository>
            <id>intelligents-ia</id>
            <name>Intelligents-ia Repository</name>
            <url>http://intelligents-ia.com/maven2</url>
        </repository>
    </repositories>
    
  • Et configurer le build de votre projet avec le plugin "keystone-plugin" (indiquer votre classe de démarrage) :
    <build>
        <plugins>
            <plugin>
                <groupId>org.intelligentsia.keystone</groupId>
                <artifactId>plugin</artifactId>
                <version>1.1</version>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <configuration>
                            <mainClass>votre.class.Main</mainClass>
                        </configuration>
                        <goals>
                            <goal>custom</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    

 

 

Soyez indulgent ce projet est tout récent, et je vais lui faire subir sa première épreuve du feu avec le projet winstone.


Dès que celle-ci m'aura permis de sécher ce projet, je compléterais cet article avec un "how to bootstrap with keystone".


A bientôt donc !

Par Jérôme Guibert, dans Documentation
4 commentaires

Envoyer à un ami 

2 annexes

4 commentaires

Jérôme Guibert

Jérôme Guibert

Le mercredi 13 avril 2011, 17:58

Le voila, il est chaud, il est prêt mon petit plugin maven pour keystone

Etape suivante, documenter ce projet! Au menu : diagramme de classe et diagramme d'activité du Bootstrap

Etape suivante de la suivante : finaliser l'utilitaire de mise a jour

hotel grand luxe à paris

hotel grand luxe à paris

Le jeudi 13 octobre 2011, 09:36

J'aime beaucoup la photo du chaton !

Amelie

Jérôme Guibert

Jérôme Guibert

Le vendredi 11 novembre 2011, 16:23

Keystone-1.4 vous permettra d'embarquer en un seul jar toute vos dépendances, en quelques lignes de configuration maven...

Jérôme Guibert

Jérôme Guibert

Le vendredi 11 novembre 2011, 16:28

Les sources du projets ont été déplacées.

Récupération du code source et construction (client svn et maven obligatoire) :

svn checkout https://intelligents-ia.googlecode.com/svn/trunk/keystone keystone --username yoursUserName
cd keystone
mvn clean package

 

Ajouter un commentaire

Identité

S'abonner pour recevoir les commentaires suivants par email

Texte

Les commentaires peuvent être formatés en utilisant une syntaxe wiki simplifiée.

:) :(( :p X-( :x :-/ 0:) B-) &gt;-)