Difference of Maven JAXB plugins Difference of Maven JAXB plugins java java

Difference of Maven JAXB plugins


Let's summarize. We have/had:

  1. the maven-jaxb2-plugin (https://github.com/highsource/maven-jaxb2-plugin)
  2. the maven-jaxb-plugin (https://jaxb.dev.java.net/jaxb-maven2-plugin/)
  3. the jaxb2-maven-plugin (https://github.com/mojohaus/jaxb2-maven-plugin)

Based on the comments of this thread, I've always used the maven-jaxb2-plugin (i.e. plugin #1):

Concerning theorg.jvnet.jaxb2.maven2:maven-jaxb2-pluginversuscom.sun.tools.xjc.maven2:maven-jaxb-plugin,from my point of view it's definitelythe first one(http://maven-jaxb2-plugin.java.net/).

This plugin has much more featuresthancom.sun.tools.xjc.maven2:maven-jaxb-plugin,the development is active. Finally,I'm one of the authors :) and I'd saywe keep in touch with JAXB developersand users and react to the latestsfeatures/requests.

And indeed, the plugin #2 is dead. And because I've always been happy with #1, I've never used plugin #3 so can't really say anything about it. Just in case, here is a working configuration for plugin #1:

<project>  ...  <build>    <plugins>      <plugin>        <inherited>true</inherited>        <groupId>org.apache.maven.plugins</groupId>        <artifactId>maven-compiler-plugin</artifactId>        <configuration>          <source>1.5</source>          <target>1.5</target>        </configuration>      </plugin>      <plugin>        <groupId>org.jvnet.jaxb2.maven2</groupId>        <artifactId>maven-jaxb2-plugin</artifactId>        <executions>          <execution>            <goals>              <goal>generate</goal>            </goals>          </execution>        </executions>      </plugin>    </plugins>  </build></project>    


I have recently tried the three plug-ins mentioned above (included here as well):

  1. the maven-jaxb2-plugin (http://maven-jaxb2-plugin.java.net/)
  2. the maven-jaxb-plugin (https://jaxb.dev.java.net/jaxb-maven2-plugin/)
  3. the jaxb2-maven-plugin (http://mojo.codehaus.org/jaxb2-maven-plugin/)

I ended up using a fourth option: The CXF XJC Maven Plugin http://cxf.apache.org/cxf-xjc-plugin.html

If I am missing something I would like to know, but the configuration seemed more straightforward for what I was trying to do and more easily allowed me to to deal with duplicate class generation within the same namespace -- similar to this question: Is there a way to deal with duplicate element definitions across multiple .xsd files in JAXB?.

I now have granular control over each incoming XSD and corresponding java package; here is a sample configuration close to the one I am using.

 <plugin>    <groupId>org.apache.cxf</groupId>    <artifactId>cxf-xjc-plugin</artifactId>    <version>2.3.0</version>    <configuration>        <extensions>            <extension>org.apache.cxf.xjcplugins:cxf-xjc-dv:2.3.0</extension>        </extensions>    </configuration>    <executions>        <execution>            <id>generate-sources</id>            <phase>generate-sources</phase>            <goals>                <goal>xsdtojava</goal>            </goals>            <configuration>                <sourceRoot>${basedir}/target/generated-sources/src/main/java</sourceRoot>                <xsdOptions>                    <xsdOption>                        <xsd>src/main/resources/schema/commands.xsd</xsd> <!--shares a common.xsd file causing the conflicts-->                        <packagename>com.foo.bar.commands</packagename>                    </xsdOption>                    <xsdOption>                        <xsd>src/main/resources/schema/responses.xsd</xsd>                        <packagename>com.foo.bar.responses</packagename>                    </xsdOption>                </xsdOptions>            </configuration>        </execution>    </executions></plugin>


I am the author of maven-jaxb2-plugin.

The maven-jaxb2-plugin currently uses JAXB 2.1. In the next versions we'll also provide JAXB 2.0 and JAXB 2.2 versions.

As for "which plugin is better" discussion, check the features, decide yourself. Let me know if you miss some functionality.