jaxb2-maven-plugin XJC example to Generate Java Classes from XSD

Filed Under: Java

Today we will look into jaxb2-maven-plugin XJC example to generate java classes from XSD. JAXB is the middleware technology between Java Classes and XML. We can use JAXB to generate XML from Java Object and vice versa.

jaxb2-maven-plugin

We use XSD to define the contract data structure, so it’s not common to generate java classes that represent the XML schema.

jaxb2-maven-plugin XJC is JAXB Binding compiler tool that can be used to generate Java Classes from XSD files.

Here we will learn how to use jaxb2-maven-plugin XJC in a maven project to generate java classes from XSD.

First of all we have to create a maven project, then we need to use jaxb2-maven-plugin plugin to generate java classes from XSD.

pom.xml


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>jd</groupId>
  <artifactId>jd</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
  <name>JD Example XSD to Java</name>


	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>
	<build>
		<plugins>
			<!-- Plugin required to build java classes from XSD using XJC -->
			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>jaxb2-maven-plugin</artifactId>
				<version>1.5</version>
				<executions>
					<execution>
						<goals>
							<goal>xjc</goal>
						</goals>
					</execution>
				</executions>
				<configuration>
                   <!-- The name of your generated source package -->
                	<arguments>-extension -npa -b ${project.basedir}/src/main/xsd/global.xjb</arguments> 
                </configuration>
			</plugin>
			
		</plugins>
	</build>
	
</project>

Notice the global.xjb file in arguments, this is where we specify java binding rules.

global.xjb


<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxb:bindings version="2.0"
  xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
  xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  jaxb:extensionBindingPrefixes="xjc">
  
 <jaxb:globalBindings>
    <xjc:simple />
    <xjc:serializable uid="-1" />
    <jaxb:javaType name="java.util.Calendar" xmlType="xs:dateTime"
      parseMethod="javax.xml.bind.DatatypeConverter.parseDateTime"
      printMethod="javax.xml.bind.DatatypeConverter.printDateTime" />
  </jaxb:globalBindings>
</jaxb:bindings>

Here is the XSD that will be used to generate java classes.

Employee.xsd


<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
	targetNamespace="https://www.journaldev.com/com/journaldev/employee/data"
	xmlns:empns="https://www.journaldev.com/com/journaldev/employee/data"
	elementFormDefault="qualified">

	<element name="empRequest" type="empns:EmpRequest"></element>
	<element name="empResponse" type="empns:EmpResponse"></element>

	<complexType name="EmpRequest">
		<sequence>
			<element name="id" type="int" minOccurs="0" maxOccurs="1" />
			<element name="name" type="string" minOccurs="0" maxOccurs="1" />
		</sequence>
	</complexType>
	
	<complexType name="EmpResponse">
		<sequence>
			<element name="id" type="int" minOccurs="1" maxOccurs="1" />
			<element name="name" type="string" minOccurs="1" maxOccurs="1" />
			<element name="role" type="string" minOccurs="1" maxOccurs="unbounded" />
			<element name="gender" type="string" minOccurs="1" maxOccurs="1" />
			<element name="salary" type="string" minOccurs="1" maxOccurs="1" />
		</sequence>
	</complexType>

</schema>

Just build the maven project using mvn clean install and you will see java classes generated in target/generated-sources/jaxb directory.

Finally the project would look something like below image.

jaxb2-maven-plugin XJC Example

Further Read: JAXB Tutorial

Reference: jaxb2 maven plugin official page, java xjc

Comments

  1. Azizasm says:

    Proper config for JAXB2 for version below 2.0 is :

    ${project.basedir}/src/main/xsd/
    Employee.xsd

  2. Mageswran says:

    How to add rootelement into java class using XJB

  3. Mageswran says:

    How to add Root element into Java class using XJB using Maven

  4. Jalaram says:

    Hi Pankaj,

    I have one question, what is purpose of -extention and -npa? where you have use this?

    -extension -npa -b ${project.basedir}/src/main/xsd/global.xjb

    Thanks

  5. DeanS says:

    You forgot to tell mvn where Employee.xsd is. You need a in your element.

  6. A S says:

    change the goal from xjc to generate if you getting Errors when trying to install with maven.

  7. Bhawani Singh Shekhawat says:

    Thanks Pankaj ! 🙂

  8. Ricardo says:

    Thanks Pankaj. I was looking for an example of the xjc maven plugin usage and yours was exactly what I needed.

Leave a Reply

Your email address will not be published. Required fields are marked *

close
Generic selectors
Exact matches only
Search in title
Search in content
Search in posts
Search in pages