CXF ou Axis ? Quelques chiffres

le 12/02/2010 par Bertrand Paquet
Tags: Software Engineering

Chez un client, j'ai du récemment vérifier que l'on pouvait facilement utiliser l'API SOAP de Crowd en Java. J'ai donc pour cela utiliser les 2 principaux framework de web service du monde Java Open source : CXF et Axis2. L'idée de cet article n'est pas de comparer fonctionnellement ces 2 frameworks, mais juste vous livrer les résultats numériques de ces essais.

Le web service à appeler est le service SecurityServer de Crowd. C'est un gros service : le WSDL fait 120K, comporte 2793 lignes et 94 opérations. Pour chaque framework, j'ai :

  • généré le bouchon client correspondant au WSDL
  • écrit un test qui utilise ce bouchon et appelle quelques services sur le serveur Crowd. Le test est identique pour chaque framework (au niveau fonctionnel et au niveau des assertions). Il est juste adapté à l'API du framework

J'ai donc essayé avec CXF, puis avec Axis 2 avec le mapping ADB, et, comme j'ai eu quelques problèmes, avec Axis 2 et le mapping XmlBeans. Dans les 3 cas, j'ai réussi à faire passer mes tests fonctionnels.

CXFAxis2 ADBAxis2 XmlBeansCommentaire
Version2.1.61.5.11.5.1
Outil de mapping XMLJAXBADBXmlBeansPour CXF, j'ai utilisé l'option de JAXB generateElementProperty='false' pour simplifier le code généré par CXF. Je ne sais pas si l'équivalent existe avec Axis.
Classes modifiées après génération ?OuiNonOuiIl faut modifier le code produit, car des classes sont générées dans le package java.lang (Exception, Throwable)
Nombres de classes générées15515498Peu de classes pour Axis2 ADB, mais tout est dans la même classe.
Nombre de lignes Java générées (LOC)4 74854 81417 798Il y a 10 fois plus de code pour Axis2 ADB que pour CXF. Cela est du au fait que CXF utilise des annotations au lieu de générer du code.
Taille de la classe principale (LOC)48354 23317 239Avec Axis2 ADB, Eclipse plante toutes les 3 minutes à cause de la classe de 54K lignes. Le projet est donc quasiment inutilisable
Nombres de resources générées001 269Contrairement aux autres, Axis 2 XmlBeans génère des fichiers de resources dont il a besoin au runtime.
Taille du projet (code source)840 K4,6 M11 M11 M de code source pour un bouchon SOAP...
Taille de la classe de test (LOC)134175233Le code le plus court et le plus joli est avec CXF. Avec Axis 2, il faut instancier plein d'objets supplémentaires liés au mapping XML.
Temps d'initialisation du bouchon2 613 ms0 ms503 msCXF est long à s'initialiser (normal, il n'y a que peu de code, tout est dans les annotations)
Temps d'exécution des tests847 ms1400 ms1357 msCXF va plus vite à l'exécution que les autres

Bilan :

  • le code généré est beaucoup, beaucoup plus petit avec CXF qu'avec les autres ...
  • le code à écrire pour utiliser le bouchon est beaucoup plus simple et joli avec CXF
  • CXF est plus long à s'initialiser, mais va plus vite après

J'utilisais déjà CXF, il me faudra des raisons très convaincantes pour passer à Axis...