Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

CXF includes a Maven plugin which can generate java artifacts from WSDL. Here is a simple example:

Code Block
xml
xml

<plugin>
	<groupId>org.apache.cxf</groupId>
	<artifactId>cxf-codegen-plugin</artifactId>
	<version>${cxf.version}</version>
	<executions>
		<execution>
			<id>generate-sources</id>
			<phase>generate-sources</phase>
			<configuration>
				<sourceRoot>${project.build.directory}/generated/cxf</sourceRoot>
				<wsdlOptions>
					<wsdlOption>
						<wsdl>${basedir}/src/main/resources/myService.wsdl</wsdl>
					</wsdlOption>
				</wsdlOptions>
			</configuration>
			<goals>
				<goal>wsdl2java</goal>
			</goals>
		</execution>
	</executions>
</plugin>

...

The following example shows some customization options. By default, the codegen plugin follows the Maven convention of "target/generated-sources/cxf" for the output folder for the generated classes. You can override this value using <sourceRoot> as shown below, but note this is usually not necessary, the default is fine for most people and can make it easier for some IDE's to detect the generated source code. Other configuration arguments can be included inside the <wsdlOption> element. These pass arguments to the tooling and correspond to the options outlined on the WSDL To to Java page.

Code Block
xml
xml

...
<configuration>
    <sourceRoot>${project.build.directory}/generated-code/mywebservice</sourceRoot>
    <wsdlOptions>
	<wsdlOption>
		<wsdl>${basedir}/src/main/resources/wsdl/myService.wsdl</wsdl>
                <!-- you can set the options of wsdl2java command by using the <extraargs> --> 
                <extraargs>
                    <extraarg>-impl</extraarg>
                    <extraarg>-verbose</extraarg>
                </extraargs>
	</wsdlOption>
    </wsdlOptions>
</configuration>
...

...

Example 1: Passing in a JAX-WS Binding file

Code Block
xml
xml

<configuration>
  <wsdlOptions>
    <wsdlOption>
      <wsdl>${basedir}/src/main/resources/wsdl/myService.wsdl</wsdl>
      <bindingFiles>
        <bindingFile>${basedir}/src/main/resources/async_binding.xml</bindingFile>
      </bindingFiles>
    </wsdlOption>
  </wsdlOptions>
</configuration>

...

Example 2: Specify the data binding

Code Block
xml
xml

<configuration>
  <wsdlOptions>
    <wsdlOption>
      <wsdl>${basedir}/src/main/resources/wsdl/myService.wsdl</wsdl>
      <extraargs>
        <extraarg>-databinding</extraarg>
        <extraarg>jibx</extraarg>
      </extraargs>
    </wsdlOption>
  </wsdlOptions>
</configuration>

...

Example 3: Specifying a service to generate artifacts for

Code Block
xml
xml

<configuration>
  <wsdlOptions>
    <wsdlOption>
      <wsdl>${basedir}/src/main/resources/wsdl/myService.wsdl</wsdl>
      <serviceName>MyWSDLService</serviceName>
    </wsdlOption>
  </wsdlOptions>
</configuration>

...

Example 4: Using defaultOption to avoid repetition

Code Block
xml
xml

<configuration>
  <defaultOptions>
      <bindingFiles>
          <bindingFile>${basedir}/src/main/jaxb/bindings.xml</bindingFile>
      </bindingFiles>
      <noAddressBinding>true</noAddressBinding>
  </defaultOptions>
  <wsdlOptions>
      <wsdlOption>
          <wsdl>${basedir}/src/main/resources/wsdl/myService.wsdl</wsdl>
          <serviceName>MyWSDLService</serviceName>
      </wsdlOption>
      <wsdlOption>
          <wsdl>${basedir}/src/main/resources/wsdl/myOtherService.wsdl</wsdl>
          <serviceName>MyOtherWSDLService</serviceName>
      </wsdlOption>
  </wsdlOptions>
</configuration>

<defaultOption> and <wsdlOption> correspond to the options outlined on the WSDL To to Java page, you may look at http://svn.apache.org/repos/asf/cxf/trunk/maven-plugins/codegen-plugin/src/main/java/org/apache/cxf/maven_plugin/Option.java for a more detailed description of those parameters.

...

Example 5: Using wsdlRoot with includes/excludes patterns

Code Block
xml
xml

<configuration>
  <defaultOptions>
      <bindingFiles>
          <bindingFile>${basedir}/src/main/jaxb/bindings.xml</bindingFile>
      </bindingFiles>
      <noAddressBinding>true</noAddressBinding>
  </defaultOptions>
  <wsdlRoot>${basedir}/src/main/resources/wsdl</wsdlRoot>
  <includes>
      <include>*Service.wsdl</include>
  </includes>
</configuration>

...

For CXF 2.3 and latter there is a new config element <wsdlArtifact> which can be used to load a wsdl file from the maven repository.

Code Block
xml
xml

    <configuration>
     <wsdlOptions>
      <wsdlOption>
       <wsdlArtifact>
        <groupId>org.apache.pizza</groupId>
	<artifactId>PizzaService</artifactId>
	<version>1.0.0</version>
       </wsdlArtifact>
      </wsdlOption>
     </wsdlOptions>
    </configuration>

...

An example showing attachment of a JAXB binding file and the CXF toString() extension is below:

Code Block
xml
xml

<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>${cxf.version}</version>
<executions>
  <execution>
    <id>generate-sources</id>
    <phase>generate-sources</phase>
    <configuration>
      <wsdlOptions>
        <wsdlOption>
          <wsdl>${basedir}/src/main/resources/wsdl/myService.wsdl</wsdl>
          <extraargs>
            <extraarg>-xjc-b,binding.xjb</extraarg>
            <extraarg>-xjc-Xts</extraarg>
          </extraargs> 
        </wsdlOption>
      </wsdlOptions>
    </configuration>
    <goals>
      <goal>wsdl2java</goal>
    </goals>
  </execution>
</executions>
<dependencies>
    <dependency>
        <groupId>org.apache.cxf.cxf<xjcplugins</groupId>
        <artifactId>cxf-xjc-ts</artifactId>
        <version>${cxf.version}</version>
     </dependency>
</dependencies>
</plugin>

...

Java 6 includes JAXB/JAX-WS 2.1 API's and a 2.1 implementations. However, sometimes it's desirable to use JAXB or JAX-WS 2.2 instead to obtain various bug fixes and enhancements. Using 2.2 with Java 6 and Maven can be a bit tricky as it requires endorsing the API jars which requires configuration of a bunch of plugins, requires use of "forking", etc... First off, both Surefire and the Compiler plugins need to be setup to point at an endorsed dir:

Code Block
xml
xml


<pluginManagement>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <compilerArguments>
                   <endorseddirs>${project.build.directory}/endorsed</endorseddirs>
                </compilerArguments>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <forkMode>once</forkMode>
                <argLine>-Djava.endorsed.dirs=${project.build.directory}/endorsed</argLine>
            </configuration>
         </plugin>
    </plugins>
</pluginManagement>

You will then need to use the maven-dependency-plugin to copy the needed artifacts into the endorsed.dir:

Code Block
xml
xml

<plugins>
    <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-dependency-plugin</artifactId>
       <executions>
          <execution>
             <phase>generate-sources</phase>
             <goals>
                 <goal>copy</goal>
             </goals>
             <configuration>
                 <artifactItems>
                    <artifactItem>
                       <groupId>javax.xml.bind</groupId>
                       <artifactId>jaxb-api</artifactId>
                       <version>2.2</version>
                    </artifactItem>
                    <artifactItem>
                       <groupId>javax.xml.ws</groupId>
                       <artifactId>jaxws-api</artifactId>
                       <version>2.2</version>
                    </artifactItem>
                  </artifactItems>
                  <outputDirectory>${project.build.directory}/endorsed</outputDirectory>
              </configuration>
           </execution>
       </executions>
    </plugin>
</plugins>

Finally, you need to do similar setup for the CXF Codegen plugin so it picks up the 2.2 API's and runtimes:

Code Block
xml
xml


<plugin>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-codegen-plugin</artifactId>
    <version>${cxf.version}</version>
    <configuration>
        <fork>once</fork>
        <additionalJvmArgs>-Djava.endorsed.dirs=${project.build.directory}/endorsed</additionalJvmArgs>
        <!-- rest of the normal codegen configuration options -->
    </configuraion>configuration>
    <dependencies>
        <dependency>
           <groupId>com.sun.xml.bind</groupId>
           <artifactId>jaxb-impl</artifactId>
           <version>2.2</version>
        </dependency>
        <dependency>
           <groupId>com.sun.xml.bind</groupId>
           <artifactId>jaxb-xjc</artifactId>
           <version>2.2</version>
        </dependency>
     </dependencies>
</plugin>

...