Déployer un War dans Fuse
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 |
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"> |
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 |
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> dev:dynamic-import 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"> |
Installez-la avec :
karaf@root> feature:repo-add file:/chemin/vers/features.xml |
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.