Apache Axis2, CXF und Sun JAX-WS RI im Vergleich

Für die Java Plattform stehen mit Axis2, CXF und der JAX-WS Referenzimplementierung gleich mehrere Open Source Web Services Toolkits zur Verfügung. Dieser Artikel beschreibt die Unterschiede der einzelnen Projekte und bietet eine Entscheidungshilfe für Entwickler und Architekten.

Für die Java Plattform gibt es mehrere APIs, z. B. für den Datenbankzugriff oder Web Anwendungen. Der Entwickler programmiert gegen den Standard nicht gegen ein Produkt. Die jeweiligen Tools oder Server bleiben austauschbar. Beispielsweise kann eine Web Anwendung mit dem Application Server IBM WebSphere oder mit dem Web Container Apache Tomcat betrieben werden. Der Austausch eines Servers ist Dank der Standardisierung durch die Java Enterprise Edition mit relativ wenig Aufwand möglich.

Mit den Web Services verhält es sich leider noch etwas anders. Es gibt zwar die JAX-WS Spezifikation, aber es gibt noch zu viele offene Fragen und alternative Ansätze bei der Anwendung von Web Services. Welche SOAP Implementierung die geeignete ist, hängt daher von den Anforderungen und vom Umfeld ab. Die folgenden Abschnitte beschreiben die Tools und Standards, die dem Entwickler für Web Services zur Verfügung stehen.

Apache Axis2

Axis 2 ist der Nachfolger des populären Axis1 Frameworks. Axis2 basiert auf einer vollkommen neuen Architektur und wurde von Grund auf neu entwickelt.

Beim Vorgänger Axis1 wurde das Deployment von Services oft bemängelt. Eine Axis2 Runtime kann in Form einer Web Anwendung in jeden JEE konformen Application Server installiert werden. Die Axis2 Web Anwendung ist jetzt selbst ein Container für Web Services. Web Services werden in ein eigenes Dateiformat mit der Endung aar gepackt. Mit diesen Archiven können Web Services zur Laufzeit über eine einfache Oberfläche installiert und konfiguriert werden. Die Konfiguration von Diensten erfolgt in Axis2 über traditionelle Deployment Descriptoren wie beispielsweise die Datei services.xml.

Zur Laufzeit können auch Module installiert werden, die zusätzlich Funktionalität, z. B. die Unterstützung für einen WS-* Standard (z. B. WS-Addressing) zur Verfügung stellen. Ein Web Service wird als eigenständige Einheit angesehen, die in die Axis2 Laufzeitumgebung installiert werden kann.

Das Aufsetzen eines Axis2 Projektes erfordert sehr viel Wissen über das Buildtool Ant. Der WSDL2Java Task generiert beispielsweise ein temporäres Projekt im build Verzeichnis samt Ant Buildfile. Das eigentliche Buildfile muss dann das generierte Buildfile aufrufen. Wird in einem Web Service eine Bibliothek wie z. B. ein JDBC Treiber verwendet, so muss dieser mittels Ant bei jedem Bauen ins generierte Projekt kopiert werden. Wer Ant nicht 100 prozentig beherrscht, wird sich daher mit Axis2 schwer tun.

Apache CXF

CXF ist mittlerweile ebenfalls ein Projekt der Apache Software Foundation. CXF entstand aus einer Fusion der Projekte XFire und Ionas Celtix.

Ziel bei der Entwicklung von CXF war die Fähigkeit zur Integration in andere Systeme. Dies spiegelt sich im CXF API sowie in der Verwendung des Springframeworks wieder. CXF kann daher leicht in bestehende Systeme integriert werden.

CXF bzw. dessen Vorgänger XFire wurde in zahlreiche open und closed Source Projekten wie ServiceMix oder Mule integriert.

Für die Entwicklung von Web Services und deren Verwendung steht ein proprietäres API und die standardisierte JAX-WS Schnittstelle zur Verfügung.

JAX-WS

Das Java API für XML basierte Web Services ist der Nachfolger der JAX-RPC Spezifikation. JAX-WS ist im Gegensatz zu seinem Vorgänger nachrichtenbasiert und unterstützt asynchronen Nachrichtenaustausch. Für die Konfiguration werden Annotations verwendet, daher wird für JAX-WS Java 5 oder eine neuere Version vorausgesetzt. JAX-WS ist nicht abwärtskompatibel zu seinem Vorgänger JAX-RPC. Das Erstellen und Konsumieren von Web Services ist mit JAX-WS relativ einfach. Dem Programmierer kommen Default-Werte für zahlreiche Parameter zugute, sodass einfache Pojos mit der @WebService Annotation als Service verwendet werden können. Listing 1 zeigt eine einfache Implementierung eines Web Services.

import javax.jws.WebService; 
import javax.jws.WebMethod; 

@WebService 
public class HelloWorldService {
 
	public String helloWorld() { 
		return "Hello World!"; 
	} 
} 
Listing 1: HelloWorld Web Service mit JAX-WS

Aus der Klasse kann auch einfach ein passendes WSDL Dokument generiert werden. Über weitere Annotationen kann gezielt Einfluss auf die WSDL Generierung genommen werden. Beispielsweise können andere Namespaces oder Elementnamen verwendet werden. Wer bereits JAXB kennt, kann mit JAXB Annotationen die Serialisierung bis ins Detail festlegen. Beim "Contract First" Ansatz können aus einem WSDL Dokument Service Interface, JAXB annotierte Klassen für die Serialisierung und ein Skeleton für die Implementierung erzeugt werden. Je nach WSDL können die generierten Klassen zahlreiche Annotationen besitzen. Unübersichtliche Annotationen sind auch der Hauptkritikpunkt von JAX-WS. Trotz dieser Kritik ist die JAX-WS Spezifikation gelungen. Sie ist mit anderen Java und Java EE Spezifikationen gut abgestimmt und kombinierbar. Listing 2 zeigt zum Beispiel ein Stateless EJB 3.0 Bean, welches gleichzeitig als Web Service dient.

@WebService
@Stateless
public class MyService{
 public String hello(String name) {
     return "Hallo"+name;
 }
} 
Listing 2: Web Service mit Stateless SessionBean

JAX-WS Reference Implementation

Die JAX-WS Reference Implementation bildet das Kernstück des Web Services Protokollstack Metro. Der Metro Stack bietet Unterstützung für die folgenden Web Services Standards:

  • WS-Addressing
  • WS-Policy
  • Web Services Security aka WS-Security
  • WS-Transaction
  • WS-Reliable Messaging
  • WS-Trust
  • WS-SecureConversation

Metro ist ausführlich dokumentiert. Neben den JAX-WS, JAXB und JWS Spezifikationen gibt es zahlreiche Tutorials und Beispiele. Besonders einfach gelingt der Einstieg mit der Netbeans IDE und den Tutorials des Enterprise Packs. Wer möchte, kann selbstverständlich auch Eclipse für die Entwicklung mit Metro einsetzen.

Web Anwendungen, die mit JAX-WS realisierte Web Services enthalten, sind im Glassfish Application Server lauffähig. Damit die Services auch in einem anderen Application Server funktionieren, müssen zwei Bibliotheken (JAX-WS und JAXB) installiert werden. Application Server wie JBoss, WebSphere oder Tomcat können in ca. 10 Minuten mit der JAX-WS Referenzimplementation nachgerüstet werden.

Performance

Die Performance ist Dank moderner Streaming XML Parser bei allen drei SOAP Engines sehr gut. Die ping Zeit für einen lokalen Roundtrip liegt bei ca. 2-4 Millisekunden (Nachrichtengröße ca. 3KB, Dual Core Notebook). Damit ist in vielen Projekten die Zeitverzögerung durch SOAP Kommunikation vernachlässigbar.

WS-* Standards

Für die Auswahl einer SOAP Engine kann auch die Unterstützung für die Familie der WS Standards enscheidend sein. Nachrichten an Dienste können beispielsweise mit Signaturen geschützt sein, wie im Standard Web Service Security - kurz WSS - beschrieben. Tabelle 1 zeigt die Unterstützung der einzelnen Toolkits für die WS-* Standards.

Standards Axis2 CXF JAX-WS/Metro
WS-Addressing X X X
WS-Coordination X(2) X
WS-MetadataExchange X
WS-Policy X X X
WS-ReliableMessaging X(3) X X
Web Services Security X(1) X(4) X
WS-SecureConversation X(1) X X
WS-SecurityPolicy X X X
WS-Transaction X(2) X
WS-Trust X X X
WS-Federation

Tabelle 1: Unterstützung für WS-* Standards (Stand November 2012)

(1) Unterstützt durch das zusätzliche Modul Apache Rampart
(2) Unterstützt durch das zusätzliche Modul Apache Kandula2
(3) Unterstützt durch das zusätzliche Modul Apache Sandesha2
(4) über Apache WSS4J Interceptor

Fazit

Keines der Web Services Frameworks ist den anderen generell überlegen. Jedes Framework hat seine Stärken. Axis2 ist modular aufgebaut, besitzt zahlreiche Features und kann als Application Server für Web Services dienen. Eine Besonderheit von Axis2 ist die Unterstützung von austauschbaren Binding Frameworks wie zum Beispiel XMLBeans. Axis2 mit dem XMLBeans Framework ist ideal für Services, die sehr komplexe Schema Definitionen verwenden. Die Nachteile von Axis2 sind dessen Komplexität sowie unzureichende JAX-WS Unterstützung. Wer mit JAX-WS arbeiten möchte, sollte daher auf Apache CXF oder die Referenz Implementierung zurückgreifen.

Wer Wert auf eine nahtlose Integration mit dem Springframework legt, ist mit Apache CXF gut beraten. Darüber hinaus ist CXF schlank und lässt sich einfach einsetzen. CXF ist das Tool der Wahl, wenn eine SOAP Engine in eine bestehende Software eingebettet werden soll.

Wer einfach nur gegen den Standard programmieren möchte, ist mit der JAX-WS Implementierung gut beraten. Vom Enterprise Pack der Netbeans Entwicklungsumgebung wird JAX-WS RI sehr gut unterstützt. Mit wenigen Klicks können Server erstellt oder Web Services aufgerufen werden. Mit JAX-WS RI steht einem auch der gesamte Metro Stack samt Unterstützung für WS-Addressing, Web Services Security, WS-Policy, etc. zur Verfügung.

Ich hoffe, dieser Artikel hat Ihnen bei der Entscheidung für ein Web Services Toolkit geholfen.

Thomas Bayer
bayer@predic8.de