Aller au contenu principal
~/GiwiSoft
220px Fuse lg

Déployer un War dans Fuse

Giwi 3 min de lecture Java, OSGI

Apache ServiceMix sert de conteneur pour l’ESB Fuse. Cet ESB se base sur JBI, Camel et ActiveMQ notamment. Cependant, il est possible de déployer un war tout ce qu’il y a de plus classique et de se servir de Fuse comme d’un conteneur de servlet.

En préalable, il faut installer Fuse avec quelques composants.

Pour se faire, il faut créer notre WebApp avec WTP d’Eclipse (comme si on voulait utiliser Tomcat). Enfin, il faut ajouter un fichier Manifest particulier dans /WebContent/META-INF contenant les lignes suivantes :

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-SymbolicName: LogViewer
Bundle-Version: 2
Bundle-ClassPath: .,WEB-INF/classes/, WEB-INF/lib/commons-codec-1.3.jar, \\
WEB-INF/lib/commons-lang-2.4.jar, \\
WEB-INF/lib/commons-logging-1.0.4.jar, \\
WEB-INF/lib/java\_memcached-release\_2.0.1.jar, \\
WEB-INF/lib/jstl.jar, WEB-INF/lib/log4j-1.2.14.jar, \\
WEB-INF/lib/log4j-over-slf4j-1.6.1.jar, WEB-INF/lib/log4j.jar, \\
WEB-INF/lib/quartz-all-1.8.4.jar, \\
WEB-INF/lib/slf4j-api-1.6.1.jar, \\
WEB-INF/lib/slf4j-ext-1.6.1.jar, \\
WEB-INF/lib/slf4j-nop-1.6.1.jar, \\
WEB-INF/lib/standard.jar
Import-Package: javax.servlet, javax.servlet.http, \\
javax.servlet.jsp, javax.servlet.jsp.tagext
Bundle-Name: Odeon-Fuse-LogViewer :: Permet de visualiser les logs
Webapp-Context: LogViewer

Attention, les directives Bundle-ClassPath et Import-Package doivent tenir sur une seule ligne (sans “\ “). Plus d’informations sur ops4j.

Enfin, dans un build.xml, vous pouvez construire votre War ainsi :

<target name="dist" depends="build">
<jar jarfile="${dist.home}/${app.name}.war"
manifest="${build.home}/WebContent/META-INF/MANIFEST.MF"
basedir="${build.home}/WebContent"
/>
</target>

Pax Web - le moteur de déploiement WAR

Le déploiement de WAR dans ServiceMix / Karaf est rendu possible par Pax Web, un extender OSGi qui intercepte les bundles WAR et les transforme en conteneur de servlets embarqué. Concrètement, Pax Web :

  • Analyse le manifeste du bundle pour trouver Webapp-Context
  • Crée un contexte servlet pointant vers ce chemin
  • Gère le classpath OSGi pour résoudre les dépendances (Import-Package)

Vérifier le déploiement dans la console

Une fois le WAR déposé dans le répertoire deploy/, ouvrez la console Karaf :

karaf@root> list | grep -i web
[ 188] [Active] [Created] [80] Pax Web - Extender - War (2.1.0)
[ 189] [Active] [Created] [80] MonApp (1.0.0)

Si le bundle est à l’état Active, le WAR est déployé. Vous pouvez aussi vérifier les servlets enregistrés :

karaf@root> http:list

Dépannage courant

Symptôme Cause possible Solution
Bundle Installed mais pas Active Dépendance manquante dans Import-Package Ajouter le package manquant ou déployer le bundle fournisseur
ClassNotFoundException pour une lib Librairie absente du Bundle-ClassPath Vérifier les chemins des JAR dans le manifeste
HTTP 404 sur /MonApp Webapp-Context absent du manifeste Ajouter Webapp-Context: MonApp
Conflit de packages Deux bundles exportent le même package Utiliser package dans la console pour analyser les exports

Pour diagnostiquer, utilisez :

karaf@root> dev:dynamic-import MonApp
karaf@root> log:display | grep -i MonApp

Alternative moderne : les features Karaf

Plutôt que de déployer un WAR brut, la pratique moderne consiste à créer une feature Karaf : un descripteur XML qui regroupe le bundle et ses dépendances.

<features name="mon-app" xmlns="http://karaf.apache.org/xmlns/features/v1.4.0">
<feature name="mon-app" version="1.0.0">
<bundle>wrap:mvn:commons-codec/commons-codec/1.3</bundle>
<bundle>mvn:com.example/mon-app/1.0.0/war</bundle>
</feature>
</features>

Installez-la avec :

karaf@root> feature:repo-add file:/chemin/vers/features.xml
karaf@root> feature:install mon-app

Les features offrent une gestion des dépendances plus fiable que le manifeste écrit à la main. Couplées à Pax Web, elles rendent le déploiement de WARs dans Karaf aussi simple que sur Tomcat.