"Devoxx is over!". Directement depuis le train du retour...
Il est traditionnel que la journée du vendredi (la matinée en fait) ne regroupe jamais les sessions les plus attendues. Cette matinée nous a tout de même amené du contenu fort intéressant.
SpringSource a profité de la matinée pour réaliser une présentation d'une heure sur leur nouvellle plateforme DMServer. DMServer a pour objectifs:
OSGI introduit la notion de Bundle, un jar définissant un MANIFEST qui définit quels packages sont visibles de l'extérieur du Bundle. La limite aux bundles dans le cadre d'une application Web reste le déploiement et l'unité de déploiement (classiquement un WAR ou un EAR). pour répondre à cela, SpringSource définit une nouvelle unité de déploiement : le PAR qu'il faut voir comme un jar définissant un MANIFEST qui contient des headers de type Application-* et qui définit quels sont les Bundle OSGI qu'il peut utiliser...Au delà de la pure problématique de déploiement, le PAR doit aussi permettre de gérer le scope des Beans à l'application...Reste que DMServer accepte de déployer de bon vieux WARs.
Il faut avouer que la session était très "par la pratique" et a consisté à transformer un WAR en PAR/WebModule. Donc du code, de l'IDE...
Prenez une application web classique regroupant dans son WEB-INF/lib quelques jars. La première étape consiste à rajouter dans le WAR un MANIFEST OSGI qui spécifie les Bundles que l'application va utiliser ainsi que leurs versions. Par exemple
Import-Package:javax.servlet:version="2.5"
Import-Library:org.springframework.spring,version"[2.5.0,3.0.0)"
Résultat des courses, le WEB-INF/lib disparait. Vous me direz qu'on savait déjà mettre des jars dans le classpath du serveur. Ce n'est pas faux mais cela ne permet de gérer qu'une seule version des jars.
L'idée est de pouvoir partager des "services" - concrètement des Beans Spring" - qui seraient communs entre différents WAR. Dans ce cas, l'application se repose sur le Service Registry mis à disposition par DMServer.
Pour faire cela, on extrait du war les classes en question (typiquement les classes des packages "services") puis il faut exposer certains packages au niveau des Bundles réutilisables puis les référencer depuis l'application Web. L'exposition de services/beans est assez simple et ce fait grâce au manifest, à un fichier de configuration spring et un fichier OSGI (et oui, cela se complexifie un peu...).
concernant le manifest donc:
Export-Package:com.octo Import-Package:org.myossproject
La première ligne de cet extrait de manifest offre la possibilité d'exporter les classes présentes dans le package com.octo. La seconde indique que le Bundle utilise le package org.myossproject. Ce fichier manifest doit (ou peut?) être complété par :
<service ref="myService" interface="com.octo.IMyService"/>
Côté WAR et application web, il est nécessaire de modifier le fichier application-context.xml pour référencer le service OSGI
précédemment exposé (vous être toujours là? ;o) ). Le fichier devient donc :
<reference id="myService" interface="com.octo.IMyService" />
Personnellement, à ce moment là je tape les limites suivantes:
La session continue avec cet exemple et démontre que l'on peut charger et décharger les bundles de la JVM sans aucun problème. La subtilité vient au moment où on décharge le bundle qui est référencé, utilisé par l'application Web. Tant que cette dernière ne réalise pas d'appels vers les services exposées par ce bundle, tout va bien. Lorsque l'on souhaite utiliser un de ces services, l'application attend jusqu'au timeout...
Là encore je tape une limite. Franchement c'est génial et la démonstration est impressionante mais (ben oui il y a un mais...)
le Web Module est un jar qui contient un répertoire particulier MODULE-INF. Ce répertoire MODULE-INF reprend l'intégralité du répertoire WebContent, c'est à dire les jsp, le WEB-INF...Ce module contient également un manifest
Module-Type:web
Web-ContextPath:myAppContextRoot
Enfin le PAR qui est un artefact d'agrégation. Ce PAR proser un fichier META-INF/MANIFEST qui reprend la liste des Bundles nécessaires à l'application Web. Le bon ordre de chargement des bundles est alors garanti par DMServer.
Bref, j'ai été plutôt prolixe sur cette session qui reste pour moi géniale. J'ai néanmoins cette (première) impression qui est que sur ce coup, les choses sont encore un peu complexes. Après, il s'agit de la première version.
Lors de cette session, un autre aspect de la productivité à été présenté : comme vérifier rapidement que son code marche correctement sur des OS et des configurations différentes ?
La réponse proposée est d'utiliser des machines virtuelles sur son poste et ainsi pouvoir tester directement les effets d'une modification et son comportement sur les différentes configuration. La démo s'est basée sur l'outil VirtualBox déployé sur OpenSolaris :
Un outil assez intéressant (désolé le nom m'échappe...) permet d'effectuer des sauvegardes incrémentales (et donc d'en faire une multitude sans prendre trop d'espace). Ces sauvegardes nous permettent de revenir à un état initiale, pour ne plus avoir des cookies ou de cache par exemple, ou encore pour vérifier l'installation ou la montée de version d'une application JavaWebStart.
Devoxx en général et l'édition 2008 reste un bon moyen de sentir ce qu'il se passe sur les thématiques d'architectures, de développement et même un peu de méthodologie (car on a noté quelques 2 ou 3 sessions taggées "Méthodologie" autour de Java).
By Benoit Lafontaine, Olivier Mallassi, Fabrice Robini