dimanche 7 octobre 2007

Tutoriel JAX-WS - Partie III (Déploiement)

Voici la troisième partie de la série "Tutoriel JAX-WS". Cette dernière va nous permettre de déployer votre Web Service à l'aide de Metro.

Descripteur de déploiement (web.xml)

Globalement, ce dont on a besoin, c'est d'exposer notre Web Service sur une URL donnée. Metro met à disposition une servlet pour le "routage" des appels clients vers les services Web. On va donc indiquer ce qu'il faut à notre container Web (Tomcat) pour cette servlet dans le fichier WEB-INF/web.xml :
Le pattern utilisé pour l'URL d'accès à la servlet permet d'intercepter toutes les URLs commençant par /services/. Ceci nous permet de déployer plusieurs Web Services.

Il manque encore l'information de mapping entre l'URL complète (appelé endpoint en Web Service) et notre classe d'implémentation. Metro utilise pour cela un fichier xml de configuration (WEB-INF/sun-jaxws.xml) qui est chargé par un listener. Nous devons donc également déclarer ce listener dans notre fichier web.xml.
Au final, voici à quoi doit ressembler notre descripteur de déploiement :


Configuration du endpoint (sun-jaxws.xml)

La configuration de notre Web Service sous Metro se fait donc dans le fichier WEB-INF/sun-jaxws.xml. L'ensemble des endpoints doivent se retrouver dans ce fichier. Voici celui qui correspond à notre cas d'école :


Configuration de Tomcat

Si vous utilisez le JDK 6, vous allez être confronté au même souci de conflit de version de JAX-WS. Par défaut, Eclipse lance Tomcat avec l'option : -Djava.endorsed.dirs="/chemin_de_tomcat6/common/endorsed"
Il suffit donc de copier la librairie webservices-api.jar de Metro ou les librairies jaxws-api.jar/jaxb-api.jar de JAX-WS RI (ce qui est équivalent) dans le répertoire défini ci-dessus.

Test du Web Service

Voilà, vous êtes maintenant prêt à lancer Tomcat et tester votre Web Service. Si vous avez tout suivi, l'URL d'accès à votre Web Service (endpoint) sera :
http://localhost:8080/testMetro/services/addnumbers
Vous devriez avoir quelque chose du genre :


Pour faire des tests complets, vous pouvez utiliser un outil comme soapUI ou celui fourni avec Eclipse (un peu plus lourd à mon goût).

N'hésitez pas à laisser des commentaires si vous avez des questions ...

9 commentaires:

Laurent a dit…

Sébastien a laissé un commentaire et suite à une mauvaise manip de ma part, j'ai supprimé son commentaire au lieu de le publier. Voici donc son contenu :

Hello !
J'ai un peu galéré pour les library dites "endorsed".
En effet, et de 1) il ne faut pas tout mettre dans endorsed, et de 2) il faut quand meme ajouter les autres .jar dans le classpath, donc :

Il faut mettre "jaxb-api.jar" et "jaxws-api.jar" dans /common/endorsed/
Et toutes les autres (de JAX-WS 2.1) dans /common/

Ensuite il faut ajouter dans le catalina.properties (celui d'eclipse si on dev') :
common.loader=[...],${catalina.home}/common/*.jar,${catalina.home}/common/endorsed/*.jar

Laurent a dit…

Je rebondis sur la remarque de Sébastien. Il ne faut mettre QUE les Jars qui correspondent aux API (ce que j'ai précisé dans le tutoriel) et pas les Jars d'implémentation.
La conséquence avec Tomcat, c'est que le Web Service ne fonctionne pas du tout !

Merci de ton retour Sébastien permettant d'insister sur ce point.

Laurent

Anonyme a dit…

Bonjour. Je tiens à vous remercier pour ce tutoriel. Il faut dire qu'on en trouve pas pareils.
Voilà, j'ai essayé de suivre toutes les étapes, mais lorsque j'essaie de lancer le run, j'obtiens l'exception :
----java.lang.NoClassDefFoundError: Files\Apache
Exception in thread "main"----
j'ai copié les jars jaxb-api et jax-ws dans endorsed, j'ai copié les autres dans common, j'ai édité le fichier catalina.properties (common.loader=${catalina.home}/
common/*.jar,...
bref, je suis embêté que cela ne marche pas, ça fait deux jours que je galère avec.
Merci de m'aider.

Laurent a dit…

khaldoune,

Content de voir que ce tutoriel te serve. Il reste encore quelques améliorations à faire mais j'ai peu de temps pour le faire.
Concernant ton problème, ce n'est pas simple de t'aider compte tenu du peu d'infos que tu donnes. Il faut dire que les commentaires de ce blog ne sont pas pratiques pour décrire un problème, ni pour donner les solutions.
Je te suggère d'ouvrir un fil sur le forum Web Service de developpez.net (http://www.developpez.net/forums/forumdisplay.php?f=301)
j'y fais un tour de temps en temps. Tu pourras y mettre une description plus précise de ton problème et je ne serais pas seul à pouvoir te répondre. Donnes des indications sur ta configuration, version de JDK, version de Tomcat, ... et surtout les messages d'erreur complets. Je ne pense pas que ce soit un gros problème mais on peut rester coincer longtemps sur une toute petite erreur ...

Laurent

Anonyme a dit…

WoW! Ce tutorial est formidable en une demi journée j'ai été capable de monté un WebServices.

J'ai eu quelque petit probleme avec des NoclassDefFound.

Finnalement, j'ai réparer le probleme en ajoutant mon project testMetro a mon classpath de apache.

Et j'ai du copier les jax-ws* dans le lib d'apache si non tout est formidable :)

Gros Merci!

Maitenant je dois m'attaqué au client :)

hthach a dit…

Salut,
Je vous fait un copier-coller d'un commentaire que j'ai laissé sur developpez.net. Merci d'avance =)

Bonjour à tous,
j'ai réalisé le tuto METRO + TOMCAT de Laurent sur http://geek-ecolo.blogspot.com/2007/...ploiement.html mais avec GLASSFISH.

J'ai donc copier la librairie "webservices-api.jar" de Metro dans \glassfish\lib\endorsed.
Ensuite, j'ai copier "jaxb-api.jar" et "jaxws-api.jar" dans \glassfish\lib\endorsed .Et "jws-api.jar" et "saaj-api.jar" dans \glassfish\lib.

Ensuite, je deploi mon projet dans glassfish. Aucun soucis.

Le webService il est présent dans glassfish dans Web Services> AddNumbersServiceImpl, mais lorsque j'appuie sur le bouton Test
=> HTTP Status 503 -
type Status report
message
description The requested service () is not currently available.

et sur http://localhost:8080/testMetro/services/addnumbers
=>HTTP Status 404 -
type Status report
message
descriptionThe requested resource () is not available.

Si quelqu'un a quelque chose à me proposer ? Merci xD

Anonyme a dit…

Bonjour,
Merci pour ces tutos ils sont super.
Par contre je rencontre quelques zones de flou.
Si le projet n'est pas dans le "webapps" de tomcat on doit l'y copier?
Les fichiers web.xml et sun-jaxws.xml se sont ceux du projet ou ceux de tomcat?

Laurent a dit…

Les fichiers web.xml et sun-jaxws.xml sont à intégrer dans l'application web et non dans Tomcat. Cette application doit pouvoir fonctionner sur d'autres produit que Tomcat (Jetty, Glassfish, ...).
Le répertoire webapps de tomcat correspond à l'endroit par défaut où déployer les applications Web, en général dans un fichier War.
Si tu utilises Eclipse, tu peux aller voir le site : http://www.eclipsetotale.com/articles/tutorial_WTP.html

Unknown a dit…

Informations précises et concises, juste ce que je cherchais, une excellente synthèse pour le déploiement des WS sous tomcat.
Mille mercis encore !!!
bravo .