如何在 jaxb2-maven-plugin 版本 2.5.0 中排除剧集文件的生成?

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

我使用 xjc goal of the jaxb2-maven-plugin 从一组 xsd 文件中生成 Java 类。

一个最小的、完整的和可验证的示例是一个具有以下 pom.xml 文件的 Maven 项目:

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

src/main/resources/ 文件夹中有一个名为 example.xsd 的文件(任何有效的 xsd 文件都可以):

<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> 确保生成的代码 没有 episode 文件。

我需要升级插件版本到2.5.0. In this version, generateEpisode 已弃用:

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

简单地将 version 更改为 2.5.0 会产生以下构建时错误:

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

通过将 generateEpisode 切换为 true 构建成功,但代码是用剧集文件生成的,我想避免这种情况。 (作为旁注,这证明 generateEpisode 事实上没有被忽略,尽管文档说了什么)。

如果可能的话,如何禁用插件版本 2.5.0 的剧集文件的生成?

经过一些研究,我得出的结论是此功能不再存在。

不过,我找到了两种排除剧集文件的解决方法:

使用JAXB2 Maven Plugin (maven-jaxb2-plugin)代替jaxb2-maven-plugin

JAXB2 Maven Plugin 是一个类似的插件,仍然支持无情节文件的生成:

<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可用于删除文件:

<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 阶段,以便在代码生成后直接执行。

尝试改用 apache cxf,因为 cxf 不会生成剧集文件。

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