Search code examples
javaweb-servicesmavenwsdljax-ws

Controlling JAX-WS wsdlLocation attribute value's (absolute path) with jaxws-maven-plugin


I have a JAX-WS-driven web service whose WSDL we generate a web service client from in another Maven module (which I'll call ws-consumer).

For better or worse, we copy the "published WSDLs" (the version of the WSDL & XSDs that the service held/generated at point of release) to our src/wsdl folder of ws-consumer and then use jaxws-maven-plugin from org.jvnet to generate a client using jaxws:wsimport with the following (truncated) configuration:

    <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>

Now, the generated client code has the following annotations applied at the class level:

@WebServiceClient(name = "MyWS", targetNamespace = "http://myws/blah", wsdlLocation = "**file:/C:/some/absolute/path/src/main/resources/META-INF/wsdl/MyWS/MyWS.wsdl"**)

emphasis mine

As you can hopefully see, the wsdlLocation attribute value has a hard-coded absolute path that is going to be incorrect when the service is deployed.

Is there any way I can "control" this by setting it to just META-INF/wsdl/MyWS/MyWS.wsdl or some other value?


Solution

  • It is possible with the Codehaus plugin:

    <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>
    

    Perhaps the plugin you are using has a similar option or perhaps you can consider switching.

    You can also provision your WSDL explicitly, in which case this property is ignored, though that may not be appropriate in a container-managed application.

    Sample code here.