How to exclude generating of episode file in jaxb2-maven-plugin version 2.5.0?

5.8k views Asked by At

I use the xjc goal of the jaxb2-maven-plugin to generate Java classes from a set of xsd files.

A minimal, complete and verifiable example would be a Maven project with the following pom.xml file:

<?xml version="1.0" encoding="UTF-8"?>
<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>com.example</groupId>
  <artifactId>jaxb2-maven-episode-test</artifactId>
  <version>1.0</version>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.compiler.source>1.8</maven.compiler.source>
  </properties>

  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>jaxb2-maven-plugin</artifactId>
        <version>2.3.1</version>
        <executions>
          <execution>
            <id>xjc</id>
            <goals>
              <goal>xjc</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <sources>
            <source>${project.basedir}/src/main/resources/</source>
          </sources>
          <generateEpisode>false</generateEpisode>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>

And a file called example.xsd (any valid xsd file will do) in the src/main/resources/ folder:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
           xmlns:tns="http://tempuri.org/PurchaseOrderSchema.xsd"
           targetNamespace="http://tempuri.org/PurchaseOrderSchema.xsd"
           elementFormDefault="qualified">
 <xsd:element name="PurchaseOrder" type="tns:PurchaseOrderType"/>
 <xsd:complexType name="PurchaseOrderType">
  <xsd:sequence>
   <xsd:element name="ShipTo" type="tns:USAddress" maxOccurs="2"/>
   <xsd:element name="BillTo" type="tns:USAddress"/>
  </xsd:sequence>
  <xsd:attribute name="OrderDate" type="xsd:date"/>
 </xsd:complexType>

 <xsd:complexType name="USAddress">
  <xsd:sequence>
   <xsd:element name="name"   type="xsd:string"/>
   <xsd:element name="street" type="xsd:string"/>
   <xsd:element name="city"   type="xsd:string"/>
   <xsd:element name="state"  type="xsd:string"/>
   <xsd:element name="zip"    type="xsd:integer"/>
  </xsd:sequence>
  <xsd:attribute name="country" type="xsd:NMTOKEN" fixed="US"/>
 </xsd:complexType>
</xsd:schema>

<generateEpisode>false</generateEpisode> makes sure that the code is generated without an episode file.

I need to upgrade the version of the plugin to 2.5.0. In this version, generateEpisode has been deprecated:

From plugin version 2.4, this parameter will not be used. Instead, episode files are generated by default with all JAXB operations.

Starting with plugin version 2.4, use the parameter episodeFileName to provide a custom name of the generated episode File (or rely on the standard file name STANDARD_EPISODE_FILENAME).

Simply changing the version to 2.5.0 gives the following build-time error:

Caused by: java.io.FileNotFoundException: C:\path-to-the-project\target\generated-sources\jaxb\META-INF\JAXB\episode_xjc.xjb

By switching generateEpisode to true the build is successful, but the code is generated with an episode file, which I want to avoid. (As a side note, this proves that generateEpisode in fact is not ignored, despite what the documentation says).

How do I disable the generation of an episode file with version 2.5.0 of the plugin, if at all possible?

2

There are 2 answers

0
Magnilex On BEST ANSWER

After some research, I have come to the conclusion that this functionality does not longer exist.

However, I have found two workaround ways of excluding the episode file:

Using JAXB2 Maven Plugin (maven-jaxb2-plugin) instead of jaxb2-maven-plugin

JAXB2 Maven Plugin is a similar plugin which still supports generation without episode file:

<build>
  <plugins>
    <plugin>
      <groupId>org.jvnet.jaxb2.maven2</groupId>
      <artifactId>maven-jaxb2-plugin</artifactId>
      <version>0.14.0</version>
      <executions>
        <execution>
          <id>xjc</id>
          <goals>
            <goal>generate</goal>
          </goals>
          <configuration>
            <schemaDirectory>${project.basedir}/src/main/resources/</schemaDirectory>
            <episode>false</episode> <!-- skips episode file generation -->
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

Deleting the file with a separate plugin

After the original plugin, the Apache Maven AntRun plugin can be used to delete the file:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-antrun-plugin</artifactId>
  <version>3.0.0</version>
  <executions>
    <execution>
      <phase>generate-sources</phase>
      <goals>
        <goal>run</goal>
      </goals>
      <configuration>
        <target>
          <delete>
            <fileset dir="${project.build.directory}/generated-sources/jaxb/META-INF/JAXB" includes="episode*.xjb" />
          </delete>
        </target>
      </configuration>
    </execution>
  </executions>
</plugin>

This needs to be hooked to the generate-sources phase so it is executed directly after the code generation.

0
swerts On

Try to use apache cxf instead, as cxf does not generate episode file.

https://cxf.apache.org/docs/application-server-specific-configuration-guide.html