mardi 7 avril 2009

Client JAX-WS avec Maven

Cela faisait longtemps que je n'avais pas fait un billet sur les Web Services. En voici donc un pour créer facilement un client JAX-WS avec Maven.

Pour commencer, dans le fichier pom.xml, il faut y mettre les repositories Sun pour les dépendances JAX-WS et le plugin utilisé pour la génération de code :
  1. <repositories>  
  2. <repository>  
  3. <id>maven-repository.dev.java.net</id>  
  4. <name>Java.net Repository for Maven 1</name>  
  5. <url>http://download.java.net/maven/1/</url>  
  6. <layout>legacy</layout>  
  7. </repository>  
  8. <repository>  
  9. <id>maven2-repository.dev.java.net</id>  
  10. <name>Java.net Repository for Maven 2</name>  
  11. <url>http://download.java.net/maven/2/</url>  
  12. </repository>  
  13. </repositories>  
  14.   
  15. <pluginrepositories>  
  16. <pluginrepository>  
  17. <id>maven2-repository.dev.java.net</id>  
  18. <url>http://download.java.net/maven/2/</url>  
  19. </pluginrepository>  
  20. </pluginrepositories>  

Ensuite, on ajoute le plugin jaxws-maven-plugin :
  1. <plugin>  
  2. <groupid>org.codehaus.mojo</groupid>  
  3. <artifactid>jaxws-maven-plugin</artifactid>  
  4. <executions>  
  5. <execution>  
  6.  <goals>  
  7.   <goal>wsimport</goal>  
  8.  </goals>  
  9.  <configuration>  
  10.   <packagename>client.jaxws.addnumbers</packagename>  
  11.   <sourcedestdir>${basedir}/src/main/java</sourcedestdir>  
  12.  </configuration>  
  13. </execution>  
  14. </executions>  
  15. </plugin>  

Par défaut, le goal wsimport génère le code pour les fichiers WSDL situé dans le répertoire src/wsdl. Nous allons donc mettre notre fichier wsdl dans ce répertoire(par exemple le addnumbers.wsdl des samples JAX-WS RI).
La balise sourceDestDir permet de définir la destination du code généré. Par défaut, il est dans target/jaxws/wsimport/java.

Une seule dépendance suffit pour le client :
  1. <dependency>  
  2.   <groupid>com.sun.xml.ws</groupid>  
  3.   <artifactid>jaxws-rt</artifactid>  
  4.   <version>2.1.4</version>  
  5.   <type>jar</type>  
  6.   <scope>compile</scope>  
  7. </dependency>  

Une simple commande mvn compile permet de générer le code et de le compiler.
La génération de code ne se fait qu'une fois tant que le répertoire target/stale existe.

Il n'y a plus qu'à créer une classe de test pour faire l'appel WebService :
  1. package client.jaxws;  
  2.   
  3. import client.jaxws.addnumbers.AddNumbersFault_Exception;  
  4. import client.jaxws.addnumbers.AddNumbersPortType;  
  5. import client.jaxws.addnumbers.AddNumbersService;  
  6.   
  7. public class AddNumbers {  
  8.   
  9.  public static void main(String[] args) {  
  10.   
  11.   AddNumbersPortType client =   
  12.     new AddNumbersService().getAddNumbersPort();  
  13.   
  14.   try {  
  15.    int result = client.addNumbers(22);  
  16.    System.out.println("Résultat : " + result);  
  17.   } catch (AddNumbersFault_Exception e) {  
  18.    System.out.println(e.getFaultInfo().getMessage());  
  19.   }  
  20.  }  
  21. }  

Pour plus de facilité, voici le fichier pom.xml complet :
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xsi="http://www.w3.org/2001/XMLSchema-instance" schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  
  2. <modelversion>4.0.0</modelversion>  
  3. <groupid>client.jaxws</groupid>  
  4. <artifactid>addnumbers</artifactid>  
  5. <version>1.0.0</version>  
  6.   
  7. <repositories>  
  8. <repository>  
  9.  <id>maven-repository.dev.java.net</id>  
  10.  <name>Java.net Repository for Maven 1</name>  
  11.  <url>http://download.java.net/maven/1/</url>  
  12.  <layout>legacy</layout>  
  13. </repository>  
  14. <repository>  
  15.  <id>maven2-repository.dev.java.net</id>  
  16.  <name>Java.net Repository for Maven 2</name>  
  17.  <url>http://download.java.net/maven/2/</url>  
  18. </repository>  
  19. </repositories>  
  20. <pluginrepositories>  
  21. <pluginrepository>  
  22.  <id>maven2-repository.dev.java.net</id>  
  23.  <url>http://download.java.net/maven/2/</url>  
  24. </pluginrepository>  
  25. </pluginrepositories>  
  26.   
  27. <build>  
  28. <plugins>  
  29.  <plugin>  
  30.   <groupid>org.codehaus.mojo</groupid>  
  31.   <artifactid>jaxws-maven-plugin</artifactid>  
  32.   <executions>  
  33.    <execution>  
  34.     <goals>  
  35.      <goal>wsimport</goal>  
  36.     </goals>  
  37.     <configuration>  
  38.      <packagename>client.jaxws.addnumbers</packagename>  
  39.      <sourcedestdir>${basedir}/src/main/java</sourcedestdir>  
  40.     </configuration>  
  41.    </execution>  
  42.   </executions>  
  43.  </plugin>  
  44.  <plugin>  
  45.   <groupid>org.apache.maven.plugins</groupid>  
  46.   <artifactid>maven-compiler-plugin</artifactid>  
  47.   <version>2.0.2</version>  
  48.   <configuration>  
  49.    <source>1.5  
  50.    <target>1.5</target>  
  51.   </configuration>  
  52.  </plugin>  
  53. </plugins>  
  54. </build>  
  55.   
  56. <dependencies>  
  57. <dependency>  
  58.  <groupid>com.sun.xml.ws</groupid>  
  59.  <artifactid>jaxws-rt</artifactid>  
  60.  <version>2.1.4</version>  
  61.  <type>jar</type>  
  62.  <scope>compile</scope>  
  63. </dependency>  
  64. </dependencies>  
  65.   
  66. </project>