Escolar Documentos
Profissional Documentos
Cultura Documentos
Introduction
L'objectif de ce document est d'arriver à déployer un Web Service sous JBoss grâce à ws4ee. Ws4ee
utilise Axis mais le déploiement automatique demande une structure de fichier WAR particulière. Il
y a déjà beaucoup de tutoriels sur internet mais aucun ne m'a permis de comprendre l'intégralité du
développement jusqu'au déploiement.
Le but de ce document n'est pas d'expliquer le fonctionnement des Web Services dans le détails, j'en
suis d'ailleurs incapable. Le but est qu'un développeur habitué a faire du Java, soit capable en
suivant ce tutoriel de développer et de déployer un Web Service sous JBoss. Et accessoirement de
comprendre comment il y est parvenu.
Logiciels utilisés
● Eclipse WTP : http://www.eclipse.org/webtools/main.php
Il s'agit là d'une version d'Eclipse avec les PlugIns pour le développement d'applications
web pré-installé. Vous pouvez aussi essayé d'installer ces PlugIns à la main mais moi, j'y
suis pas arrivé.
● Java WSDP : http://java.sun.com/webservices/downloads/previous/index.jsp
Il s'agit la des librairie de développement web de Java. Je m'en suis servi pour générer les
fichiers wsdl et mapping.xml. On peut certainement faire autrement mais cette solution est
la seule qui marchait dans mon cas.
● Librairie Axis : http://ws.apache.org/axis/
Théoriquement, elle est déjà incluse avec la version WTP d'éclipse et vous n'aurez donc pas
a vous en préoccuper. Mais si vous en avez besoin, vous saurez où la trouver.
Paramétrage éclipse
Après le premier lancement d'éclipse, on va paramétrer un poil la bête histoire de se sentir plus à
l'aise.
Conseil, lors du démarrage il vous demande quel est le répertoire de l'espace de travail. Changez
celui par défaut pour un répertoire qui n'a pas d'espace dans le nom. Autrement, cela pose des
problèmes lors de l'utilisation de wscompile.
Allez donc dans Fenêtre > Préférences puis "Java > Chemin de génération"
A "Dossier source de sortie" changez pour "Dossiers" et laissez les valeurs. Eclipse va pour chaque
projet créer des sous-répertoires où il mettra les sources et le classes.
Création du projet
Une fois le paramétrage effectué, on va pouvoir créer le projet :
Choisissez "Fichier > Nouveau > Projet ..." puis dans la liste "Web > Dynamic Web Project"
Renseignez le nom du
projet puis faites
"Terminer".
Développement du EndPoint
Déjà qu'est ce qu'un EndPoint ? Un EndPoint une l'URL donnant accès à un service par un protocol
spécifique. En gros, c'est un point d'accès à une classe Java ou plutôt à une classe dérivé d'une
interface qui étend la classe java.rmi.Remote.
(cf. http://www.w3.org/TR/ws-gloss/#endpoint)
Créez un nouveau package "bonjour" et à l'intérieur une interface "BonjourIF" qui ressemble à ça :
package bonjour;
import java.rmi.Remote;
import java.rmi.RemoteException;
Je ne vais pas m'étendre sur l'écriture de la classe, c'est du Java standard. Toutes les fonctions
publiques de la classe seront visible dans le Web Service. (En réalité, les fonctions utilisables dans
le cadre du WS sont paramétrées dans le fichier wsdl).
Si par exemple on veut que la fonction "salutToi" de notre WS retourne la liste des gens qui
répondent au bonjour avec leur nom et leur réponse (oui je sais, c'est débile mais c'est un exemple !)
on va avoir quelque chose comme ça :
package bonjour;
public class Bonjour implements BonjourIF {
public WSReponse salutToi (String p_name) {
return new WSReponse();
}
}
Commençons par créer la classe UneReponse avec les variables membres qui vont bien :
public class UneReponse {
private String nom;
private String reponse;
public UneReponse() {
}
}
On peut constater que la classe est dans un autre package "bonjour.types". Ca permettra de mieux
structurer et pour ceux qui vont faire le client, c'est plus facile à relire.
Ensuite, juste ça ne suffira pas pour pourvoir générer le WSDL. Donc on va vite fait bien fait
générer les getter & setter grâce à éclipse.
Pour cela on se positionne sur la
classe, puis on fait click-droit et
on va dans "Source > Générer les
methodes d'accés get et set..."
Vous avez alors tout les accésseurs nécessaires à votre classe pour quelle soit correctement
interprété par wscompile.
Passons maintenant à la classe WSReponse qui ressemble à ça une fois que les accésseurs sont créé
:
package bonjour.types;
public WSReponse() {
On notera que j'ai volontairement utilisé un simple tableau plutôt qu'un Vector ou un ArrayList.
Pour des raison de compatibilités on n'utilisera pas de type complexe. En cherchant sur internet j'ai
vue que cela n'était pas impossible mais si, par exemple, vous créez un WS en Java avec ce genre de
classe, et que derrière quelqu'un veux développer un client en C++, l'utilisation de classe complexe
va poser des problème voir rendre cela impossible.
Voilà, maintenant que les classes de retour sont créer, il faut vous débrouiller avec les accésseur
pour remplir correctement vos champs. Ne créer pas d'autre fonction membre de ces classes, elles
ne seraient pas utilisables dans les clients générés à partir du wsdl. C'est pas toujours pratique mais
c'est comme ça :).
Empaquetage du Web Service dans un WAR
Ant
Ant est pour le Java ce que Make est pour le C++. Cela permet de créer des scripts de compilation
pour automatiser les actions fastidieuses et répétitives.
Justement, la génération de certains fichier XML ainsi que de certaines classe est une opération
relativement fastidieuse. On crée donc un script Ant pour générer automatiquement ces deux
fichiers xml et les classes à l'aide de wscompile (inclus dans Java WSDP).
WSDL et mapping
Les premiers fichiers que l'ont va créer sont le fichier wsBonjour.wsdl et jaxrpc-mapping.xml.
Pour ce faire, on utilise wscompile, un utilitaire présent dans Java WSDP. Le truc c'est que
l'opération est un peu fastidieuse et que vous risquez de la reproduire un paquet de fois. On va donc
créer un script Ant.
Ant est à Java ce que Make est au C++. Cela permet de créer des script de compilation pour
automatiser les actions fastidieuses et répétitives.
J'ai testé plusieurs façon de créer le script et plusieurs syntaxes mais la seule chose qui ai bien
marché pour moi c'est de créer manuellement le fichier "wscompile.xml" dans le répertoire du
projet :
<?xml version="1.0" encoding="UTF-8"?>
<project basedir="." default="wscompile" name="wsBonjour">
<property name="build.webinf.dir" value="WebContent/WEB-INF" />
<property name="build.classes.dir" value="build/classes" />
<target name="wscompile">
<exec executable="wscompile.bat">
<arg line ="-verbose -cp ${build.classes.dir} -gen:server -f:
rpcliteral -d ${build.webinf.dir}/wsdl -mapping ${build.webinf.dir}/jaxrpc-
mapping.xml ${basedir}\wsconfig.xml"/>
</exec>
<move todir= "${build.classes.dir}">
<fileset dir = "${build.webinf.dir}/wsdl">
<exclude name="*.wsdl"/>
</fileset>
</move>
</target>
</project>
Concernant le script Ant, on s'assurera que "wscompil.bat" est bien accessible, sinon il faudra le
mettre dans la variable PATH de la machine.
Sur la ligne contenant les arguments de wscompile on retrouve :
● -cp <classpath> qui contient le classpath nécessaire pour générer les fichiers. On y met le
répertoire de sortie de nos classes.
● -gen:server qui indique que l'on génère la partie serveur du WS.
● -f:rcplitteral qui est l'encodage (enfin, je suis pas sur de moi sur celui là
● -d <rep de sortie> qui est le répertoire de sortie pour les fichiers générés
● -mapping <mapping.xml> qui est le nom du fichier de mapping a générer
● <wsconfig.xml> qui est le nom du fichier de configuration
Une fois que tout est prêt, clic droit sur "wscompile.xml" puis "Exécuter en tant que ... > Génération
Ant ..."
A la sortie de la génération, vous devez obtenir quelque chose qui ressemble a ça :
Fichier web.xml
Celui ci est normalement déjà présent dans votre répertoire WEB-INF. Mais il n'est pas terrible
alors on va le modifier :
Ce fichier va servir a déclarer une servlet au niveau du serveur d'applications (je suis pas hyper sur
de ça). Donnez un nom à cette servlet, indiqué la classe correspondante.
Fichiers JBoss
Maintenant il ne nous reste plus que les fichiers JBoss.
Tout d'abord, le fichier jboss-web.xml
Je sais pas trop bien à quoi est ce qu'il sert celui là, il est quasi vide mais j'ai pas essayé sans.
Ce fichier indique à JBoss que c'est un Web Services qu'il va déployer et lui donne la localisation
des différents fichier dont il aura besoin pour le déploiement.
Tout ces derniers fichier sont a créer manuellement dans le répertoire "WebContent\WEB-INF" de
votre projet.
Déploiement
Voilà, tous les fichiers sont créés et correctement rempli. Il ne reste plus qu'a déployer le WS. Pour
cela, vous faites un click droit sur le projet puis "Exporter...". Dans la liste choisissez "Web > WAR
file".
Ce que vous pouvez faire
c'est choisir directement
la destination du
répertoire de
déploiement de votre
JBoss. Sinon, il faudra
l'y copier manuellement.
Une fois que le fichier WAR s'y trouve, JBoss va faire tout le boulot :
15:29:38,288 INFO [TomcatDeployer] deploy, ctxPath=/wsBonjour,
warUrl=.../tmp/deploy/tmp36525wsBonjour-exp.war/
15:29:38,519 INFO [WSDLFilePublisher] WSDL published to: file:/C:/install/jboss-
4.0.3SP1/server/CCS/data/wsdl/wsBonjour.war/wsBonjour.wsdl
15:29:38,569 INFO [AxisService] WSDD published to: C:\install\jboss-
4.0.3SP1\server\CCS\data\wsdl\wsBonjour.war\bonjour.Bonjour.wsdd
15:29:38,579 INFO [AxisService] Web Service deployed: http://Albator:8080/wsBonjour
Une fois votre WS déployé, il faut le tester. Pour cela, deux solutions :
● Développer un client qui va faire appel à celui ci. C'est un peu long si on est pressé et que
l'on a pas besoin de client par la suite.
● Utiliser ce merveilleux outil qu'est Eclipse pour tester que cela fonctionne bien.
Test du Web Service
Eclipse WTP dispose d'un outil plutôt très sympa pour tester un web service sans se faire chier à
faire un client. C'est le "Web Service Explorer" !
Donc allez dans "Run > Launch Web Service Explorer"
Génération du Stub
Le Stub est l'ensemble des classes clientes pour l'appel à un web service. Elles sont
automatiquement générée grâce au fichier wsdl (Fichier de description que l'on a généré lors de la
création du web service). Si vous ne l'avez pas, il est toujours possible de le trouvé en tapant l'URL
http://localhost:8080/endpoint?wsdl .
Dans un nouveau projet, importez le fichier wsdl. Puis faites un clic droit sur celui-ci "Web
Services > Generate Client".
Descendez le curseur
jusqu'à "Develop
client" puis cliquez
sur "Terminer".
Si cela a bien fonctionné, vous avez une arborescence qui ressemble à ça :
// Création du service
w_service = new WsBonjourLocator();
L'avertissement vient du fait que l'on a pas inclus la librairie mail.jar dans le classpath du projet.
C'est pas grave mais ça pourrait poser des problèmes selon les web services que l'on consomme. Il
suffira d'ajouter mail.jar dans la liste des librairies du projet pour que l'avertissement disparaisse.