Как исключить создание файла эпизода в jaxb2-maven-plugin версии 2.5.0?

Я использую XJC цель jaxb2-Maven-плагин для создания классов Java из набора XSD файлов.

Минимальным, полным и поддающимся проверке примером может быть проект Maven со следующим файлом pom.xml:

<?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>

И файл с именем example.xsd (подойдет любой допустимый файл xsd) в папке src / main / resources /:

<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>убеждается, что код генерируется без в эпизоде файла.

Мне нужно обновить версию плагина до 2.5.0. В этой версии generateEpisode устарел:

Начиная с версии плагина 2.4 этот параметр использоваться не будет. Вместо этого файлы эпизодов создаются по умолчанию со всеми операциями JAXB.

Начиная с версии плагина 2.4, используйте параметр EpisodeFileName, чтобы указать собственное имя созданного файла эпизода (или полагайтесь на стандартное имя файла STANDARD_EPISODE_FILENAME).

Просто изменив versionдо 2.5.0 дает следующую ошибку времени сборки:

Вызвано: java.io.FileNotFoundException: C:\path-to-the-project\target\generated-sources\jaxb\META-INF\JAXB\episode_xjc.xjb

Путем переключения generateEpisode к trueсборка выполнена успешно, но код создается с файлом эпизода, чего я хочу избежать. (Кстати, это доказывает, чтоgenerateEpisode фактически не игнорируется, несмотря на то, что говорится в документации).

Как отключить генерацию файла эпизода в версии 2.5.0 плагина, если это вообще возможно?

2 ответа

Решение

После некоторого исследования я пришел к выводу, что этой функции больше не существует.

Однако я нашел два обходных способа исключения файла эпизода:

Использование JAXB2 Maven Plugin (maven-jaxb2-plugin) вместо jaxb2-maven-plugin

Плагин JAXB2 Maven - похожий плагин, который по-прежнему поддерживает генерацию без файла эпизода:

<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>

Удаление файла отдельным плагином

После исходного плагина для удаления файла можно использовать плагин Apache Maven AntRun:

<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>

Это нужно привязать к generate-sources phase, поэтому он выполняется сразу после генерации кода.

Вместо этого попробуйте использовать apache cxf, так как cxf не создает файл эпизода.

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

Другие вопросы по тегам