¿Cuál es diferencia entre JAX-WS, Axis1, Axis2, CXF y Metro?
Tags: jaxws, axis2, cxf, metro
Published: 2021-08-27 00:47:10

Cuando empezamos a aprender sobre servicios web de una forma más completa y detallada, al inicio podemos percibir cierta complejidad; y aunque el concepto de Web Service es relativamente simple, esa complejidad existe debido a la gran cantidad de acrónimos para designar la enmarañada de tecnologías que componen el universo de los Web Services, especialmente en el lenguaje de programación Java.  

Se necesita mucho tiempo y dedicación para aprenderlas de verdad que solo un par de clases en la universidad y asistir uno o diez videos en YouTube. Y muchas veces es difícil aprenderlas todas, pues apenas uno llega a ver solo una pequeña parte y en ocasiones desconocemos las tecnólogas que componen nuestro proyecto, ya que simplemente manejamos el concepto de Web Service como tal. Y cuando buscamos ayuda, leemos artículos en internet o vemos videos en YouTube, tenemos a enredarnos pues los títulos son poco descriptivos (“Como crear un web service”, “Aprender a crear un servicio web SOAP”, “Crear un servicio REST”, “Crear un servicio con JAX-RS”, “Crear un servicio con JAX-WS”, “Generar un servicio usando wsdl2java”, “Generar un cliente usando wsimport”, “Leer un servicio usando JDOM”, “Consumir un servicio usando HttpURLConnection” , “Consumir un servicio usando HttpClient”, “Consumir un servicio usando Jackson”, “Crear un cliente SOAP usando Apache HttpClient”, “Generar un cliente SOAP en Maven”, etc.). Uno puede aprender viendo estos videos y leyendo muchas publicaciones, sin embargo, la idea es poder aprenderlas en orden y compararlas para poder entender el universo de los servicios web, ya que para entender las nuevas tecnologías es bueno conocer las viejas también. 

Un profesor de historia que nasce en el año 2000 no solo tiene que conocer su historia actual en adelante, sino que también debe aprender la historia en donde no le tocó vivir. Lo mismo sucede con los Web Services, es un tema que requiere de muchísimo tiempo y dedicación, hay que leer mucho, investigar y sobre todo practicar. Cuando era estudiante, me preguntaba a mí mismo, “¿Pero qué enredo, tantas tecnologías para crear y consumir un servicio web?” Y eso que esta pregunta me lo hacía hace 8 años atrás. Hoy en día existen muchísimas más tecnologías las cuales muchas veces nos causan un estrés aprenderlas pues desconocemos la historia y apenas llegamos a ver una pequeña parte de ellas.

Esta pregunta me surgió hace mucho tiempo y que veo que hoy en día a muchísimos estudiantes y profesionales también les causa curiosidad y al mismo tiempo confusión, pues a mi opinión personal, los institutos y universidades no son un lugar de estudio, es solo un lugar en donde nos enseñan, nos llenan de tareas, de exámenes y de proyectos, y casi nunca hay un tiempo pleno para sentarnos a leer, investigar, ordenar ideas tranquilamente sin la presión de tener que entregar mañana alguna tarea, presentar algún proyecto o estudiar para un examen. El alumno está más preocupado en aprobar que se le olvida aprender de verdad. 

Dicho esto, ¿cuál será la diferencia entre JAX-WS, Axis1, Axis2, CXF y Metro? Bueno, de primera mano les digo que los cinco pueden ser usados para crear servicios web en Java y existen otras muchas más, pero digamos que estas son las bases; y para poder entender las diferencias entre ellas, deben responder a las siguientes preguntas:

* ¿Qué es RPC?
* ¿Qué es Java RMI?
* ¿Qué es XML-RPC?
* ¿Qué es JAX-RPC
* ¿Qué es JAX-WS?

**¿Qué es RPC?**

Es una tecnología de comunicación entre procesos que permite que un programa de computadora llame a un procedimiento en otro espacio de direcciones (comúnmente en otra computadora, conectada por una red). Desde el punto de vista del código, la llamada se asemeja a las llamadas a procedimientos locales. En otras palabras, RPC es una tecnología que permite implementar el modelo cliente - servidor.

**¿Qué es Java RMI?**

Es un mecanismo ofrecido por Java que existe desde la versión 1,1 del JDK para invocar un método de manera remota. Es decir, permite que un objeto que se ejecuta bajo el control de una máquina virtual Java pueda invocar métodos de un objeto que se encuentra en ejecución bajo el control de una máquina virtual Java diferente. Estas dos máquinas virtuales pueden estar ejecutándose como dos procesos independientes en el mismo ordenador o en ordenadores distintos conectados a través de una red TCP/IP.

La principal diferencia de utilizar RPC o RMI, es que RMI es un mecanismo para invocación remota de procedimientos basado en el lenguaje de programación Java que soporta interacción entre objetos, mientras que RPC no soporta esta característica.

**¿Qué es XML-RPC?**

Es un protocolo de llamada a procedimiento remoto (RPC) que utiliza XML para codificar sus llamadas y HTTP como mecanismo de transporte. Este protocolo sencillo fue creado en el año de 1998 y poco tiempo después dejó de ser considerado un estándar sencillo para conversarse en lo que es actualmente conocido como SOAP.

**¿Qué es JAX-RPC?**

JAX-RPC (Java API for XML-based RPC), o en español API de Java para RPC basado en XML, permite que una aplicación Java invoque un servicio web basado en Java a través de su WSDL. Puede verse como RMI de Java a través de servicios web.

En JAX-RPC 2.0 se cambió el nombre a JAX-WS 2.0 para alejarse del estilo RPC y pasar hacia servicios web de estilo de documento.

**¿Qué es JAX-WS?**

JAX-WS (Java Api for XML Web Services), o en español API de Java para servicios web XML. Es una tecnología desarrollada a partir de Java Enterprise Edition 5 (JEE5), que permite construir servicios web y clientes SOAP que se comunican utilizando XML.

**Entonces, ¿cuál es la diferencia entre JAX-WS, Axis1, Axis2, CXF y Metro?**

La diferencia es que JAX-WS es una especificación (es una API), así como lo es JAX-RS o JMS, mientras que Axis2, CXF y Metro son sus implementaciones. Por otro lado, Apache Axis se basa en JAX-RPC (API predecesora de JAX-WS) y en la actualidad, ha sido reemplazado por las otras tecnologías.

De manera sencilla y para que lo entiendas, puedes ver a JAX-WS como una interfaz y a Axis2, CXF o Metro como una clase que implementa dicha interfaz.

El uso de una u otra implementación, dependerá de la integración que queramos realizar en nuestro proyecto. Por ejemplo, si quisiéramos integrar JAX-WS con Spring, CXF sería una muy buena opción ya que tiene soporte con Spring y Camel, así como OSGi y ActiveMQ para JMS (Java Message Service). Por otro lado, Axis 2 y CXF no solo implementan JAX-WS, sino que también implementan la especificación JAX-RS por lo que soportan muy bien la exposición de servicios como REST y SOAP, entre otras muchas razones por las que podríamos querer utilizarlas. Asimismo, entre los componentes de Metro se incluyen JAXB RI, JAX-WS RI, SAAJ RI, StAX (implementación de SJSXP), WSIT y otras APIs. Y si necesitáramos alguna de las cosas más complejas como WS-Security, WS-SecureConversation, WS-RM, WS-Policy, etc., necesitaríamos usar algunas de las alternativas mencionadas anteriormente.

Cabe mencionar que hoy en día, los servicios web SOAP son de alguna manera obsoletos; aunque todavía se enseña y se utiliza, la nueva tendencia es utilizar servicios web REST, es decir crear servicios con la especificación JAX-RS, utilizando alguna de sus implementaciones como Axis2, CXF, Jersey, Restlet, REST-assured, HttpCient, Apache HttpClient, OKHttp, Retrofit, etc.

Espero que este post haya sido de tu agrado y si te gustó dele me gusta y compártelo con tus amigos; y recuerda que existen muchas maneras de crear y consumir un Web Service sea este SOAP o REST. Puede que no siempre sea la opción más conveniente o quizá no sea posible el uso de alguna de esas herramientas, aunque eso sí, no cabe duda de que facilitan muchísimo el desarrollo que sin ellas sería bastante arduo. 

Como dato adicional, en la actualidad existe una nueva tecnología llamada GraphQL la cual fue creada por Facebook en el 2012 y lanzada el 2015, y que vendría a ser una arquitectura alternativa a REST.

La principal diferencia entre SOAP y REST, es que SOAP es un protocolo (es un estándar, tiene normas que cumplir), y REST no lo es (no tiene reglas, permite muchos formatos de datos diferentes, o sea que puedes enviar un JSON, un TEXTO, un XML, un HTML, etc. Lo importante es que el cliente y el servidor se entiendan y estén contentos).

**Referencias**

Les dejo los siguientes enlaces para que puedan leer más al respecto, por mi parte será hasta otra oportunidad. ¡Qué tengan un buen día!

RPC: https://es.wikipedia.org/wiki/Llamada_a_procedimiento_remoto
Java RMI: https://es.wikipedia.org/wiki/Java_Remote_Method_Invocation
XML-RPC: https://es.wikipedia.org/wiki/XML-RPC
JAX-RPC: https://es.wikipedia.org/wiki/JAX-RPC
JAX-WS: https://es.wikipedia.org/wiki/JAX-WS
Apache Axis1: https://axis.apache.org/axis/java/
Apache Axis2: https://axis.apache.org/axis2/java/core/
Apache CXF: http://cxf.apache.org/
Metro: https://javaee.github.io/metro/
GlassFish Metro: https://es.wikipedia.org/wiki/GlassFish_Metro
¿Por qué usar Apache Axis2? https://axis.apache.org/axis2/java/core/
¿Por qué usar Apache CXF? http://cxf.apache.org/docs/why-cxf.html
¿Por qué usar Apache Metro? https://javaee.github.io/metro/
Servicio web: https://es.wikipedia.org/wiki/Servicio_web