J'ai un service Web géré par JAX-WS dont nous générons un client de service Web dans un autre module Maven (que j'appellerai ws-consumer
).
Pour le meilleur ou pour le pire, nous copions les "WSDL publiés" (la version des WSDL et XSD conservés/générés au moment de la publication) dans notre dossier src/wsdl
de ws-consumer
, puis nous utilisons jaxws-maven-plugin
à partir de org.jvnet pour générer un client à l'aide de jaxws:wsimport
avec la configuration suivante (tronquée):
<plugin>
<groupId>org.jvnet.jax-ws-commons</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.1</version>
<executions>
<execution>
<!--phase>generate-sources</phase -->
<goals>
<goal>wsimport</goal>
</goals>
<configuration>
<wsdlDirectory>src/main/resources/META-INF/wsdl/</wsdlDirectory>
<wsdlFiles>
<wsdlFile>MyWS/MyWS.wsdl</wsdlFile>
</wsdlFiles>
</configuration>
</execution>
</executions>
</plugin>
Maintenant, le code client généré a les annotations suivantes appliquées au niveau de la classe:
@WebServiceClient(name = "MyWS", targetNamespace = "http://myws/blah", wsdlLocation = "**file:/C:/some/absolute/path/src/main/resources/META-INF/wsdl/MyWS/MyWS.wsdl"**)
l'emphase mien
Comme vous pouvez l'espérer, la valeur de l'attribut wsdlLocation
a un chemin absolu codé de manière irréversible qui sera incorrect lors du déploiement du service.
Existe-t-il un moyen de "contrôler" cela en le réglant simplement sur META-INF/wsdl/MyWS/MyWS.wsdl
ou une autre valeur?
C'est possible avec le plugin Codehaus:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>1.9</version>
<executions>
<execution>
<goals>
<goal>wsimport</goal>
</goals>
</execution>
</executions>
<configuration>
<keep>true</keep>
<verbose>true</verbose>
<wsdlDirectory>../wscontract/src/main/resources/wsdl</wsdlDirectory>
<wsdlLocation>wsdl/MaintainAddress.wsdl</wsdlLocation>
<sourceDestDir>src/main/Java</sourceDestDir>
<bindingDirectory>.</bindingDirectory>
<bindingFiles>
<bindingFile>jaxb/xsdbindings.xml</bindingFile>
<bindingFile>jaxb/wsdlbindings.xml</bindingFile>
</bindingFiles>
</configuration>
</plugin>
Peut-être que le plugin que vous utilisez a une option similaire ou peut-être pouvez-vous envisager de changer.
Vous pouvez également configurer votre WSDL explicitement, auquel cas cette propriété est ignorée, bien que cela puisse ne pas être approprié dans une application gérée par conteneur.
Exemple de code ici .
Utilisez wsdlLocation avec le plugin jaxws-maven de org.jvnet.jax-ws-commons:
<plugin>
<groupId>org.jvnet.jax-ws-commons</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<goals>
<goal>wsimport</goal>
</goals>
</execution>
</executions>
<configuration>
<wsdlDirectory>src/main/resources/wsdl</wsdlDirectory>
<wsdlFiles>
<wsdlFile>arsdev.wsdl</wsdlFile>
</wsdlFiles>
<wsdlLocation>wsdl/*</wsdlLocation>
<!-- Keep generated files -->
<keep>true</keep>
<packageName>jaxws.remedy.client.generated</packageName>
<!-- generated source files destination -->
<sourceDestDir>target/generated-code/src</sourceDestDir>
</configuration>
</plugin>
J'ai voté pour @ dean-schulze answer, comme il convient dans le cas de org.jvnet.jax-ws-commons: jaxws-maven-plugin plugin.
Il peut également être intéressant d’afficher l’aide locale avec la CLI, comme ceci:
mvn jaxws:help -Dgoal=wsimport -Ddetail
Comme indiqué dans la réponse précédente, nous pouvons utiliser le paramètre wsdlLocation, décrit ici:
wsdlLocation
@WebService.wsdlLocation and @WebServiceClient.wsdlLocation value.
Can end with asterisk in which case relative path of the WSDL will be
appended to the given wsdlLocation.
Example:
...
<configuration>
<wsdlDirectory>src/mywsdls</wsdlDirectory>
<wsdlFiles>
<wsdlFile>a.wsdl</wsdlFile>
<wsdlFile>b/b.wsdl</wsdlFile>
<wsdlFile>${basedir}/src/mywsdls/c.wsdl</wsdlFile>
</wsdlFiles>
<wsdlLocation>http://example.com/mywebservices/*</wsdlLocation>
</configuration>
...
wsdlLocation for a.wsdl will be http://example.com/mywebservices/a.wsdl
wsdlLocation for b/b.wsdl will be
http://example.com/mywebservices/b/b.wsdl
wsdlLocation for ${basedir}/src/mywsdls/c.wsdl will be
file://absolute/path/to/c.wsdl
Note: External binding files cannot be used if asterisk notation is in
place.
L'option -wsdllocation est également documentée dans la commande wsimport du JDK:
Mais cela dit simplement (voir @WebServiceClient javadoc ):
Specifies the @WebServiceClient.wsdlLocation value.