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

In this example we're running the wsdl2java goal in the generate-sources phase. By running mvn generate-sources, CXF will generate artifacts in the <sourceRoot> directory that you specify. Each <wsdlOption> element corresponds to a WSDL that you're generated artifacts for. The WSDL location is specified via the <wsdl> option. Following Maven standard directory layout, if you're planning on packaging the WSDL in the JAR you're creating you'll want the WSDL above in /src/main/resources/ (alternatively in a subfolder underneath it if desired to avoid placing resources in the root of a JAR); else use the /src/main/config folder to keep the WSDL out of the JAR.

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 Java page.

See this blog entry for a full service and client example that uses the cxf-codegen-plugin.

Example 1: Passing in a JAX-WS Binding file

In this example we're specifying that we want CXF to use our JAX-WS binding file. Binding files are a way to customize the output of the artifacts that CXF generates. For instance, it allows you to change the package name CXF uses.

Example 2: Specify the data binding

In this example we're specifying that we want CXF to use our data binding jibx. You can also using the data binding of xmlbeans, domsources, sdo etc.

Example 3: Specifying a service to generate artifacts for

In this example we're specifying that we only want to generate artifacts for the service named "MyWSDLService" in the WSDL.

To avoid copy/paste in multiple <wsdlOption> you can also declare a <defaultOption> element.

At least, you can declare a common wsdlRoot folder where you store your WSDL files and use includes/excludes patterns to select the files to get used by the code generator

Example 5: Using wsdlRoot with includes/excludes patterns

wsdlRoot default value is src/main/resources/wsdl so you may omit this declaration.

Example 6: Loading a wsdl from the maven repository

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.

This will load the wsdl /org/apache/pizza/PizzaService-1.0.0.wsdl into your local maven repository and generate java code from it.

Example 7: Using xjc extensions

Standard JAXB command-line customizations can be added via <extraarg> elements, either one per line or comma separated. CXF also offers some JAXB extensions for the code generation. They have to be added as dependencies and then activated by using an extraarg with content -xjc-X<extension id>

artifact id

description

extension id

cxf-xjc-boolean

Adds getters for booleans

boolean

cxf-xjc-bug671

Workaroung for JAXB bug 671

bug671

cxf-xjc-dv

Default value support

dv

cxf-xjc-ts

Adds toString to objects

ts

cxf-xjc-wsdlextension

WsdlExtension support

wsdlextension

jaxb-fluent-api

Fluent API for setters

fluent-api

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

Example 8 - Using JAXB/JAX-WS 2.2 with Java 6

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:

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

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

Other configuration options

The cxf-codegen-plugin has some additional configuration options that may be useful: