Instalando Axis2
May 14, 2007Axis2 es el nuevo motor de webservices de Apache. Su arquitectura ha sido diseñada desde cero, teniendo en cuenta las lecciones aprendidas con Axis1. Cabe destacar su mejor rendimiento, pero sobretodo su sistema de módulos que permite, de forma sencilla, añadir nuevas funcionalidades y soportar futuras especificaciones sobre webservices.
Axis2 puede utilizar SOAP 1.1, SOAP 1.2 y REST. Además soporta las especificaciones WS-Security, WS-ReliableMessaging, WS-Addressing, WS-Coordination y WS-Atomic Transaction.
Con esto, queda presentado Axis2. Para más información puedes consultar su página web.
Preliminares
Si quieres seguir este tutorial antes debes instalar:
-
JDK 1.4 o superior, con la variable de entorno JAVA_HOME fijada.
-
ANT 1.6.5 o superior. Para ejecutar los samples y generar una distribucion war a partir de la standard. No olvides añadir la carpeta bin al path y fijar la variable ANT_HOME.
-
Tomcat 5.X o superior. En realidad servirá cualquier contenedor de servlets.
Descargar
Lo primero es bajarse el Axis2. En la página donde descargar Axis2 se pueden encontrar los siguientes tipos de distribución:
-
Standard Binary Distribution. Es la versión completa de Axis2. Puede ejecutarse, a diferencia de Axis1, como un servidor independiente o generar una aplicación web para desplegar en un contenedor de servlets. Contiene además las herramientas wsdl2java, java2wsdl y los samples.
-
Source Distribution. Contiene el código fuente y puede generarse una versión ejecutable con Maven.
-
WAR (Web Archive) Distribution. Esta es una versión lista para ser desplegada como una aplicación web en un contenedor de servlets.
-
Documents Distribution. Es un zip con toda la documentación.
Descargamos la primera opción, Standard Binary Distribution, y se descomprime en una ruta a nuestra elección.
A continuación se debe crear la variable de entorno AXIS2_HOME para que apunte a la ruta donde se ha descomprimido Axis2, pej: /opt/axis2
NOTA: En el momento de realizar este tutorial la última versión de Axis2 es la 1.2, durante el resto del tutorial se supondrá que se está trabajando con esta versión.
Estructura
Echemos un vistazo al Axis2 que acabamos de instalar y encontraremos la siguiente estructura de carpetas:
-
bin: contiene scripts para ejecutar Axis2 como un servidor standalone y ejecutar las herramientas wsdl2java y java2wsdl.
-
conf: incluye el fichero de configuración axis2.xml.
-
lib: las librerias que usa Axis2.
-
repository: contiene los servicios (webservices) y módulos disponibles.
-
samples: códigos de ejemplo.
-
webapp: contiene la aplicación web de administración de Axis2. Se incluye sólo para la generación de una distribución war de Axis2.
Modo standalone
Axis2 puede ejecutarse de 2 modos, como aplicación web desplegada en un contenedor de servlets o como servidor standalone gracias a un mini servidor web que trae integrado.
El modo standalone es una novedad respecto a Axis1 y muy útil para el desarrollador en entornos limitados. Usa el script axis2server de la carpeta bin para arrancar el servidor de Axis2. Abre la página http://localhost:8080/axis2/services para comprobar que Axis2 se ha iniciado correctamente. Podras ver el único webservice desplegado, llamado Version, y obtener su WSDL (ver figura 1).
Por defecto, el servidor standalone de Axis2 usa el puerto tcp 8080. Si quieres, puedes cambiarlo en el fichero de configuración axis2.xml de la carpeta conf.
<transportReceiver name="http" class="org.apache.axis2.transport.http.SimpleHTTPServer">
<parameter name="port">6060</parameter>
[…]
</transportReceiver>
Si usas JDK6 y tienes problemas, debes copiar el stax-api.jar de la carpeta lib de Axis2 a la carpeta lib/endorsed del JRE o common/endorsed del Tomcat si vas a usar Axis2 en Tomcat.
Despliegue en caliente de webservices
Una de las novedades más importantes de Axis2 es la posibilidad de desplegar en caliente webservices. Para ello basta con copiar el webservice al repositorio, carpeta services. Adios al AdminClient de Axis1!
El modelo de despliegue de Axis2, similar al nuevo modelo J2EE, define un formato para empaquetar los webservices. Un fichero .aar (en realidad es un jar) que contendrá los ficheros class, jar y recursos del webservice más un fichero de configuración dentro de la carpeta META-INF llamado services.xml.
¿Vemos un ejemplo?
-
Abre una consola y colocate en la carpeta samples/pojo de Axis2.
-
Ejecuta: ant. Si no funciona correctamente revisa que el path contiene la carpeta bin de ant y revisa también las variables de entorno JAVA_HOME, AXIS2_HOME y ANT_HOME.
-
Se habrá creado una carpeta build y dentro el fichero AddressBookService.aar. En realidad es un jar, así que puedes abrirlo con un simple descompresor. Dentro están las clases del webservice y el fichero de configuración services.xml que define el nombre, ámbito, receptores de mensajes y el nombre de la clase principal del servicio. Es muy sencillo, lo veremos en detalle cuando veamos cómo desarrollar webservices.
-
Copia el fichero AddressBookService.aar a la carpeta repository/services de Axis2 y ya está!
-
Abre de nuevo http://localhost:8080/axis2/services en un navegador y verás como el servicio AddressBookService se ha desplegado sin tener que reiniciar el servidor (ver figura 2).
<service name="AddressBookService" scope="application">
<description>
POJO: AddressBook Service
</description>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
</messageReceivers>
<parameter name="ServiceClass" locked="false">sample.addressbook.service.AddressBookService</parameter>
</service>
Este nuevo modelo de despliegue permite también la actualización en caliente de un webservice (aunque por defecto está desactivada). Las características de despliegue y actualización en caliente pueden configurarse en el fichero axis2.xml.
<axisconfig name="AxisJava2.0">
<parameter name="hotdeployment">true</parameter>
<parameter name="hotupdate">false</parameter>
[…]
</axisconfig>
Modo aplicación web
Aunque el modo standalone es muy útil, lo normal es distribuir Axis2 como una aplicación web para usar toda la potencia y funcionalidad de nuestro contenedor de servlets favorito.
Veamos cómo generar un Axis2 war:
-
Abre una consola y colocate en la carpeta webapp de Axis2.
-
Ejecuta: ant.
-
Se habrá generado el fichero axis2.war dentro de una nueva carpeta dist en Axis2. Esta distribución contiene el fichero de configuración axis2.xml (carpeta conf) y los webservices (services) y módulos (modules) del repositorio de Axis2 en el momento de ser generada.
Por supuesto, siempre está la opción de bajarte la distribución WAR directamente.
La distribución web de Axis2 contiene una aplicación de administración. Vamos a verla. Copia el axis2.war generado a la carpeta webapps del Tomcat. Arranca el Tomcat y abre http://<host>:<port>/axis2 en un navegador (ver figura 3).
Puedes listar los servicios disponibles, validar el estado y administrar Axis2. El usuario es admin/axis2 (puede modificarse en axis2.xml). Con él puedes gestionar los servicios y módulos existentes, además de subir nuevos servicios que serán desplegados automáticamente gracias al despliegue en caliente de Axis2.
Hay que tener en cuenta que las modificaciones que hagamos se perderan con el reinicio del Tomcat o del Axis2. Para que los cambios en la configuración perduren deben hacerse directamente en el fichero axis2.xml. Por eso, si se va a estar "tocando" la configuración o los servicios lo mejor será descomprimir el axis2.war en webapps/axis2 y borrar el axis2.war de webapps.
Hasta aquí, esto es todo. Sé que me dejo muchas cosas, como módulos, desarrollo de servicios, clientes, handlers, seguridad, etc. Lo veremos poco a poco, el siguiente tema será cómo desarrollar un webservice desde WSDL.

Hola ! :
Tu tutorial me ha resultado de gran ayuda, muchas gracias!!!!.
Ahora estoy empezando a hacer pruebas con Axis 2, sabes si un wervicio web POJO puede devolver cualquier tipo o sólo puede devolver tipos simples (long, int, String…)?
Comment by albert — July 17, 2007 @ 8:35 pm
Hola Albert.
Muchas gracias por el comentario. Empezaba a dudar de si realmente le habia servido a alguien…
No me gusta crear un webservice a partir de un POJO y haciendole un java2wsdl. Yo prefiero el enfoque contrario (wsdl2java).
Aun así he visto y usado varios webservices creados a partir de POJOs y algunos devolvian otros POJOs. Por lo tanto, yo diría que sí. Y en teoria la herramienta java2wsdl debe hacerte todo el trabajo sucio de mappings.
Comment by Administrator — July 18, 2007 @ 6:52 pm
Hola de nuevo !! :
Pues sí, al menos a mí tu tutorial me ha servido, y mucho!!. A mí también me gusta más el enfoque de partir de un WSDL pero de momento no controlo mucho sobre el tema, soy totalmente nuevo en esto y ando un poco perdido. Al final después de mucho trastear conseguí hacer un servicio web POJO básico devolviendo tipos complejos creados por mí y no sólo tipos simples de java. Sé que el servicio web funciona porque puedo ver que así es desde mi navegador, pero lo que no consigo es hacer un cliente RPC en java que acceda al servicio web ni a la de 3… cuando el cliente invoca al servicio web obtengo una AxisFault provocada por una java.lang.InstantiationException. He revisado el código mil veces y lo he rehecho partiendo de uno de los ejemplos que vienen con Axis 2 y que sí me funciona pero nada… no acabo de ver en qué estoy metiendo la pata
Comment by albert — July 19, 2007 @ 1:38 am
Hola Albert.
Hasta que no pruebes de verdad el webservice no sabes si funciona o no. Ahora mismo lo que sí sabes es que lo has desplegado, te falta probarlo.
Existen herramientas para probar facilmente un webservice. A partir del wsdl te permiten seleccionar la operación que quieras usar y te pasan el XML de la petición para que rellenes los valores de los campos. Es decir solo tienes que pasarles el endpoint (url) del servicio terminado en ?wsdl. Ahora mismo me acuerdo de XMLSpy, Jmeter y Soapui. Mi preferida es XMLSpy, pero cuidado con la licencia
En cuanto al error que comentas me temo que no puedo ayudarte mucho. Lo primero quizas seria que distinguieras si el AxisFault se genera en el cliente o en el servicio. Si es en el cliente el error puede ser desde que estas poniendo mal el endpoint (url) a que estas construyendo mal la petición.
De todas formas, por qué no creas un cliente con el wsdl2java?
Comment by Administrator — July 19, 2007 @ 10:47 am
Hola Julio !!! :
Gracias de nuevo por tu interés y por tus sabios consejos, que tendré muy en cuenta a partir de ahora. Sobre lo de probar el servicio web, en Axis 2 no es necesario usar esas herramientas, pues te permite invocar al servicio a través de REST, es decir, pones la URL en el navegador, le pasas los parámetros que necesita el servicio a través de la URL (siempre que sean tipos simples, claro) y ya te devuelve en el navegador el XML devuelto por el servicio, por eso sabía que el servicio funcionaba y el problema estaba en el cliente.
De todos modos, anotaré el nombre de esas herramientas por si las necesito en un futuro.
Finalmente he conseguido resolver el problema, aunque es un problema muy extraño y no sé si se debe a un bug de Axis 2 o si es así como realmente debe comportarse. Yo en mi servicio web POJO devuelvo una clase que yo he definido, que tiene 3 campos privados con sus correspondientes métodos get y set. Pues bien, yo había añadido un constructor a esa clase para poder inicializar la clase en el momento de crearla y no tener que hacerlo con más líneas de código usando los métodos get y set. Pues si compilo el servicio web y el cliente de esa forma, no funciona, pero si elimino ese constructor con parámetros y dejo solo las variables privadas y los métodos get y set, entonces funciona perfectamente. Ahora bien, como ya te digo, no tengo ni idea de si eso es lo que debe hacer y hay algún motivo por el que no permita que la clase devuelta tenga un constructor con parámetros o si bien todo se debe a un bug en Axis 2.
Nuevamente gracias por tu interés y tu ayuda.
Comment by albert — July 19, 2007 @ 1:47 pm
Hola Albert.
Muy interesante lo del REST, no tenia ni idea. Aunque lo de los tipos simples lo deja muy limitado…
Volviendo a lo del error. Es lógico lo que me cuentas, un POJO no es ni más ni menos que el JavaBean de toda la vida. Y la definición de JavaBean incluye que debe tener, al menos, un constructor sin parametros.
A mi al principio tambien me gustaba tener un constructor con parametros para evitarme los sets. Pero el codigo antes o despues hay que modificarlo y el tiempo que te ahorras en no hacer los sets luego lo pierdes en mirar el orden de los parametros del constructor. Y en mi opinión queda un codigo mas elegante, aunque sean mas lineas.
Comment by Administrator — July 22, 2007 @ 9:47 pm
Hola de nuevo, Julio !! :
Sí que es interesante lo de REST, sobre todo cuando estás haciendo pruebas.
Sobre lo del error, sí, investigando un poco finalmente me dí cuenta de que hacía falta ese constructor sin parámetros, y una vez que se lo puse ya todo funcionó bien, bueno… al menos las pruebas que hice, ahora tengo que hacer los servicios web de verdad, que espero que no me den tantos problemas!. El problema es que las definiciones que hay por ahí sobre lo que es un POJO no son excesivamente claras para alguien que empieza, pero bueno, es lo que hay.
Sí, supongo que tienes razón en lo de que el código queda más elegante con los sets, y ya que tengo que poner los métodos, trataré de usarlos aunque no esté acostumbrado.
Una vez más, muchas gracias por tu tiempo y tu interés!!!!!!, muchas graciassssssssss!!!!!!!. Un saludo :
Albert
Comment by albert — July 24, 2007 @ 8:21 am
Hola de nuevo, Julio !! :
Tengo una duda. He estado buscando información pero no he encontrado gran cosa al respecto, y como tú controlas tanto del tema, a lo mejor para tí es algo obvio y que puedes responderme sin hacerte perder mucho tiempo.
Si hago un servicio web POJO y un cliente RPCServiceClient siguiendo la guía que viene en la web de Axis 2, ¿qué pasará realmente por debajo cuando el cliente invoque el servicio web? ¿se usará el protocolo SOAP o el protocolo XML-RPC para comunicar cliente y servidor?.
Muchas gracias de antemano, Julio!!. Saludos!!.
Comment by albert — July 31, 2007 @ 9:31 am
Hola albert.
Gracias por el halago pero me temo que disto mucho de ser cualquier clase de gurú o experto en Axis2, Webservices o bueno en realidad cualquier tema!
Y para muestra un botón, digo tu duda. Te daré mi opinión y alguna pista que espero te ayuden a resolverla. Te ayudaría más, pero me pillas en fuera de juego, fuera de casa realmente y sin recursos ni tiempo para instalarme Axis2 o profundizar. Eso sí, espero que luego me cuentes el final!
Allá voy entonces:
1- Prueba a obtener el wsdl del servicio y consulta el campo protocol. Aunque en realidad si tiene wsdl yo ya optaria por soap, en principio el wsdl nace con soap.
2- Usa la herramienta tcpmon para capturar los mensajes de entrada y salida del servicio. Así veras si es un mensaje soap o no.
En principio yo apuesto por SOAP, aunque la clase se llame RPCServiceClient no implica que sea XML-RPC, de hecho en la doc no dice nada. Los dos (SOAP y XML-RPC) son dos formas o protocolos de hacer RPC o llamadas a procedimientos remotos. Bueno ya me cuentas eh…
Comment by Administrator — August 1, 2007 @ 12:02 am
Gracias por este inmejorable tutorial sobre la instalación de AXIS. He de desarrollar un servicio web que envie mensajes SOAP y reciba mensajes. Espero poder salir adelante con tu experiencia expuesta en tu blog. Gracias por estar ahi con tutoriales como este. Saludos Cordiales.
Comment by Andres Ortega — August 1, 2007 @ 2:33 pm
Hola Julio!!! me ha encantao el tutorial, ademas me esta sirviendo de mucho, ya que no tengo ni idea y me han mandado hacer mi proyecto fin de carrera con axis2, tomcat y netbeans, un servidor web, y tu blog me ha servido para tomar algunas notas y poder comenzar.
tengo q hacer en primer lugar un servidor con varios clientes, y lo unico q tienen q hacer esq el cliente manda un paquete vacio al servidor y éste le envia un paquete que contiene un documento xml q se encuentra en el disco duro, alguien podria echarme una mano???? esq no tengo ni idea de como empezar……
muchisimas gracias por todo, esq necesito ir avanzando algo en esto, ademas q estoy haciendolo en grecia, estoy alli de erasmus….
gracias de nuevo!!!
Sonia
Comment by Sonia — October 29, 2007 @ 11:51 pm
Hola Sonia.
Gracias por tu comentario lo primero. Cuando dices que no tienes ni idea, espero que no te refieras de Java en general, porque entonces lo vas a tener muy duro.
Yo te recomendaria que hicieras unos cuantos tutoriales para ir cogiendole el truco y total lo que te han pedido no parece mucho mas complicado.
Eso sí, Axis2 por lo general se lleva mejor con eclipse que netbeans, yo hablaria con tu tutor para usar eclipse como ide o si se empeña en netbeans usar otro motor de webservices que no sea Axis2. De hecho si coges netbeans tienes un monton de documentacion, incluso videos, para hacer servicios web. Aunque sean en inglés supongo que para una erasmus como tu no debe ser un problema… De hecho yo tiraria por esta segunda opción.
Mucho animo y un saludo desde España!
Comment by jcesarperez — October 30, 2007 @ 8:43 pm
Hola, cuando hago File New Dynamic Proyect sale una opcion Axis2 1.1, pero el drop down list no da opciones para seleccionar la version 1.2 o 1.3…osea eso significa que mi eclipse no reconoce el axis2?
Pero no puedo crear el servicio web ni levantar la pagina de confirmacion…es mas incluso indica algunsoerrores cuando crea el proyecto.
obiamente ya le indique en Preferences Axis2 y la ruta y en runtime tb ya selecione Axis2.
uso, eclipse3.3 wtp 2.0 tomcat 6.0 Axis 1.3 porque es el mas reciente.
Como pueodsolucionar el problema?
Comment by javier — December 26, 2007 @ 6:13 pm
Hola Javier.
Estas en lo cierto, el modulo de Axis2 de Eclipse no está actualizado más allá de Axis2 1.1. De todas formas, yo intente usarlo en su momento con Axis2 1.1 y no iba muy bien como tu dices y termine dejandolo de lado.
Por eso te recomiendo usar directamente los plugins de Axis2 para eclipse. Aunque estos tambien tienen sus bugs… Lo mejor es usar ANT!
Comment by jcesarperez — December 29, 2007 @ 1:42 pm
como se llman los archibos del axis q te permiten ver los id de los items
Comment by odi — January 3, 2008 @ 11:49 pm
disculpa mi ignorancia pero como fijo la variable ant_home
Comment by George — October 22, 2008 @ 3:52 am
Este tutorial resulta realmente aclaratorio, incluido los comentarios
Comment by Fer — January 14, 2009 @ 3:07 pm