Montag, 22. Dezember 2008

Marktanteile von Axis1, Axis2, CXF, JAX-WS RI und XFire

Auf der diesjährigen OIO Konferenz zu Java und XML konnte ich die Teilnehmer meines Vortrags über die eingesetzten SOAP Toolkits befragen. Heraus kam dabei folgendes:






Axis111
Axis26
CXF8
JAX-WS0
XFire0

Das Ergebnis entspricht in etwa meinen Erfahrungen in Projekten und Beratungen. Obwohl es inzwischen überholt ist setzen viele noch Axis1 mit JAX-RPC ein. Trotz dass Axis2 eine komplette Neuentwicklung ist, die mit Axis1 nur den Namen und die Entwickler bei Apache gemeinsam hat, sind viele von Axis1 zu Axis2 gewechselt. Von den Befragten gab nur einer an, CXF mit dem JAX-WS Frontend zu verwenden. Die Übrigen setzen das Aegis Binding ein. Der Anteil der Web Services, die mit JAX-WS realisiert sind ist noch relativ gering. Er dürfte jedoch höher sein, als das Ergebnis in der Befragung. Ich vermute, dass sich einige, die JAX-WS mit CXF oder der Referenzimplementierung einsetzen, meinen Vortrag, der Axis, CXF und die RI verglich, erspart haben. Ich glaube, dass sich die Anteile zugunsten von JAX-WS noch verschieben werden, da die Entwicklung mit JAX-WS recht einfach ist und mit CXF sowie die RI zuverlässige und schnelle Implementierungen verfügbar sind.

Mittwoch, 10. Dezember 2008

JAX-WS mit Axis2

Die JAX-WS Spezifikation ist mittlerweile der Standard für die Web Services Entwicklungen mit Java geworden.
Dazu beigetragen haben die JAX-WS Referenzimplementierung und Apache CXF, welches ebenfalls JAX-WS in der Version 2.1 unterstützt. Seit kurzem bietet auch das Axis 2 Projekt Unterstützung für JAX-WS. Um zu entscheiden, ob wir für ein Projekt Axis2 mit JAX-WS einsetzen können, haben wir der JAX-WS Umsetzung von Axis2 in der Version 1.4.1 auf den Zahn gefühlt. Für den Einstieg befindet sich auf der Axis2 Homepage ein JAX-WS Guide, der JAX-WS und JAXB sowie die Entwicklung von Services beschreibt. Die Axis2 Distribution enthält auch einige Beispiele zu JAX-WS. Allerdings beschränken sich die Beispiele auf einfache Operationen, die nur primitive Datentypen und Strings für die Parameter verwenden. Die Komplexität der Beispiele entspricht daher der Signatur der echo Operation:

public String echo (String msg)

Wird in der Signatur ein komplexer Typ in Form eines Beans verwendet so lässt sich der Service bauen und installieren. Bei der Ausführung wirft Axis allerdings eine Exception, die einen darüber informiert, das Axis2 keinen JAXB Kontext anlegen konnte. Der Bug ist bekannt und steht im Bugtracking System JiRA. Dort findet sich auch ein Patch, der sich allerdings nicht mit der Axis2 1.4.1 Version kombinieren lässt. Es besteht also Hoffnung, dass es bald eine Axis2 1.4.2 Version geben wird, die mit komplexen Typen als Parameter funktioniert.
In Axis2 fehlen Werkzeuge, um aus Code oder WSDL „portable Artefakte“ zu erzeugen. Portable Artefakte sind Java Klassen und Beans, die JAX-WS, JWS und JAXB Annotationen enthalten. Diese Klassen werden von der Runtime für das Serialisieren und Deserialisieren von Nachrichten benötigt. Wer mit Axis2 JAX-WS einsetzen möchte muss daher auf Tools einer anderen Implementierung zugreifen. Man kann beispielsweise die Tools wsgen und wsimport der JAX-WS Referenzimplementierung verwenden. In Java 6 ist diese bereits enthalten, d. h. wer Axis2 in Verbindung mit den Java 6 SDK einsetzt, benötigt nichts weiter. Es stellt sich allerdings die Frage, warum man nicht gleich alles mit JAX-WS Referenzimplementierung macht, wenn man diese auch für Axis2 zumindest zur Compile-Zeit benötigt. Zumal die Referenzimplementierung auch mit komplexen Datentypen zurecht kommt und JAX-WS 2.1 unterstützt. Axis2 unterstützt in der Version 1.4.1 nur einen Bruchteil von JAX-WS 2.0 und JAXB 2.0. Auf der Webseite wird die JAXB Umsetzung von Axis2 als experimentell bezeichnet. Die JAX-WS Umsetzung in Axis2 ist in der Version 1.4.1 daher leider nur für sehr einfache Web Services mit Einschränkungen einsetzbar.
Es besteht allerdings Hoffnung, das Axis2 in einer kommenden Version eine brauchbare JAX-WS bieten wird. Dann steht den Entwicklern eine weitere interessante Alternative für die Entwicklung von Web Services mit Java Standards zur Verfügung.