Point de départ : vous disposez d’un fichier jar contenant au moins une classe annotée JAX-WS (ou JSR 181, c’est pareil).
Exemple (à compiler et packager dans un jar, les tutos JAX-WS ne manquent pas) :
package calculette;
import javax.jws.*;
@WebService
public class Calculette {
@WebMethod
public int addition (int n1, int n2) { return n1 + n2; }
@WebMethod
public int soustraction (int n1, int n2) { return n1 - n2; }
}
Donc : installez axis2 (lancez Tomcat, et copiez axis2.war dans le répertoire webapps).
Ensuite : il manque le répertoire « servicejars » dans axis2/WEB-INF !
Donc, créez-le.
Il vous suffit maintenant de copier votre jar (celui du web service) dans le nouveau répertoire « servicejars », et Axis2 déploiera le Web Service (vérifiez dans logs/catalina.out, ou dans la console d’admin d’Axis2).
Reste un bug lors de l’accès au WSDL : le WSDL 2 fonctionne bien (url-de-votre-endpoint?wsdl2), mais le WSDL 1 (celui dont vous avez généralement besoin : url-de-votre-endpoint?wsdl) donne l’erreur suivante :
<error>
<description>Unable to generate WSDL 1.1 for this service</description>
−
<reason>
If you wish Axis2 to automatically generate the WSDL 1.1, then please set useOriginalwsdl as false in your services.xml
</reason>
javax.xml.ws.WebServiceException: Error occurred generating WSDL file for Web service implementation class {calculette.Calculette}: {java.lang.ClassNotFoundException: com.sun.tools.ws.spi.WSToolsObjectFactory}
at org.apache.axis2.jaxws.description.builder.JAXWSRIWSDLGenerator.generateWsdl(JAXWSRIWSDLGenerator.java:187)
at org.apache.axis2.jaxws.description.builder.JAXWSRIWSDLGenerator.initialize(JAXWSRIWSDLGenerator.java:371)
at org.apache.axis2.jaxws.description.builder.JAXWSRIWSDLGenerator.getWSDL(JAXWSRIWSDLGenerator.java:364)
at org.apache.axis2.description.AxisService.printWSDL(AxisService.java:1340)
at org.apache.axis2.transport.http.ListingAgent.processListService(ListingAgent.java:199)
at org.apache.axis2.transport.http.AxisServlet.doGet(AxisServlet.java:254)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:306)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:541)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:383)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:288)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.ClassNotFoundException: com.sun.tools.ws.spi.WSToolsObjectFactory
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1676)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at org.apache.axis2.jaxws.description.builder.JAXWSRIWSDLGenerator.generateWsdl(JAXWSRIWSDLGenerator.java:166)
... 22 more
</error>
Pour corriger ce problème, il faut faire pointer le CLASSPATH de Tomcat vers certaines librairies de votre JDK : dans mon cas (JDK 1.6.0_18),
lib/tools.jar et jre/lib/javaws.jar .
Le plus simple est d’ajouter dans le répertoire bin/ de Tomcat un fichier setenv.sh (ou .bat pour les amateurs de Windows, je suppose ?), dont je vous livre le contenu ci-dessous (adaptez à votre système et à vos répertoires) :
#!/bin/sh echo "Hello from setenv.sh" export CLASSPATH=/usr/local/java/lib/tools.jar:/usr/local/java/jre/lib/javaws.jar
Ensuite, relancez Tomcat. Votre session devrait ressembler à ceci (notez la trace « Using CLASSPATH: », en bas) :
gibello@colibri:~/apache-tomcat-7.0.8$ bin/startup.sh Hello from setenv.sh Using CATALINA_BASE: /home/gibello/apache-tomcat-7.0.8 Using CATALINA_HOME: /home/gibello/apache-tomcat-7.0.8 Using CATALINA_TMPDIR: /home/gibello/apache-tomcat-7.0.8/temp Using JRE_HOME: /usr/local/java Using CLASSPATH: /usr/local/java/lib/tools.jar:/usr/local/java/jre/lib/javaws.jar:/home/gibello/apache-tomcat-7.0.8/bin/bootstrap.jar:/home/gibello/apache-tomcat-7.0.8/bin/tomcat-juli.jar
Et surtout, l’accès au WSDL doit maintenant fonctionner… Ouf, moi qui croyais que JAX-WS c’était « plug and play » !