23 décembre 2007

services-web : Metro vs CXF vs Axis2

J'ai utilisé depuis X années Axis1 comme pile Soap, parfois avec douleur quand il a fallu rentrer dans le code pour identifier un problème de sérialisation... le code n'étant pas vraiment limpide !

Avec la norme Jax-WS et les "nouvelles" piles SOAP, d'autres solutions sont possibles. J'ai eu l'occasion sur un projet qui démare de faire une rapide évaluation :
  • Metro (implémentation de référence de Jax-WS, faisant partir du projet Glassfish)

A priori attractif, en raison de l'aspect "respect des standard". L'essai n'a pas été très concluant :

  1. la gestion des dépendances Maven est délicate, car on fait référence à un grand nombre de jars javax.* et com.sun.* qui sont dans le repository maven1 de dev.java.net. On doit donc jongler avec les repositories
  2. le plugin wsdl -> service, basé sur jaxb2.1 ne fonctionne pas sous Java6. Merci à Sun d'avoir pensé son API de manière si évolutive !
  3. le plugin plante sur mon WSDL, qui utilise des imports.
  4. le support pour Spring utilise un repository TRES surprenant : http://ndeloof.free.fr, mon site perso à moi que j'ai ! Celui sur lequel j'ai placé les -sources des jars Spring à tritre temporaire...
  • Axis2

Après le succes de fait de Axis 1 (faute d'alternative ?), axis2 semble la solution à suivre.

  1. D'après ce que j'ai pu lire, les premières versions ont été une calamité en terme de bugs
  2. Le plugin wsdl2java plante sur mon WSDL avec un joli NullPointerException
  3. Le POM.xml du projet fait référence à repo1.maven.org/maven1 + repo1.maven.org/maven2. Non seulement ce sont les repository par défaut, mais le premier est une redirection vers le second. Détail, mais qui montre le niveau de support pour maven2
  4. Le principe de packages un "aar" pour le déployer dans la webapp est hyper lourd. Je n'ai JAMAIS eu besoin de déployer à chaud un service web, sans avoir à relivrer toute l'application qui va avec. Je suppose qu'il y en a à qui ça sert, mais ça devrait n'être qu'une option.
  • Apache CXF (ex apache Cletix + codehaus Xfire fusionnés)

J'ai déjà entendu pas mal de bien de XFire, qu'en est-il de sa fusion avec Celtix ?

  1. La génération Wsdl -> service fonctionne. C'est déjà bien
  2. Les méta données Maven2 sont bonnes, via le repository de l'incubateur apache
  3. L'intégration avec Spring est triviale, via un namespace dédié et trois lignes de XML
  4. Un transport "local" permet de tester le service web (sérialisation SOAP incluse) sans déployer de serveur HTTP. Super pratique pour écrire des tests unitaires.
  5. Possibilité de tracer facilement les messages SOAP dans les logs : pratique

Pour ce qui me concerne, CXF est donc vainqueur par KO. J'ai pu développer et écrire un test unitaire pour mon service en quelques heures, en ne connaissant rien à l'outil à priori. La doc est claire et correspond à ce qu'on obtient réellement (ce qui est rare ;-p). L'intégration avec maven2 et Spring est très bonne, critère qui n'est pas forcément celui de tout le monde mais qui a son importance pour moi.

Mon second choix irait à Metro si les "petits problèmes" sont corrigés

Quand à Axis2 - "pourquoi faire simple ..." - moi qui cherche un moyen de faire du service web via juste quelques fichiers de conf, voila qu'il faut faire un projet dédié, packager un "aar", le déployer, créer des modules et je ne sais quoi... tout ça pour un "hello world" ?