当前位置: 首页 > 知识库问答 >
问题:

如何在jaxb2 maven插件版本2.5.0中排除生成事件文件?

越伟泽
2023-03-14

我使用jaxb2 maven插件的xjc目标从一组xsd文件生成Java类。

一个最小的、完整的、可验证的例子是一个带有以下pom的Maven项目。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的文件。src/main/resources/文件夹中的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>

我需要将插件的版本升级到2.5.0。在这个版本中,不建议使用GenerateEpisode

从插件版本2.4开始,将不使用此参数。相反,默认情况下,所有JAXB操作都会生成事件文件。

从插件版本2.4开始,使用参数eposodefilename提供生成的插曲文件的自定义名称(或依赖标准文件名standard_插曲_FILENAME)。

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

原因:java。伊奥。FileNotFoundException:C:\path to the project\target\generated sources\jaxb\META-INF\jaxb\eposion\u xjc。xjb

通过将generateEpisode切换到true,构建成功,但代码是用一个插曲文件生成的,这是我想要避免的。(作为旁注,这证明了不管文档怎么说,generateEpisode实际上并没有被忽略)。

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


共有2个答案

梁丘波鸿
2023-03-14

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

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

包修贤
2023-03-14

经过一些研究,我得出结论,这个功能已经不存在了。

但是,我发现了两种排除剧集文件的解决方法:

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

这需要连接到生成源阶段,以便在代码生成后直接执行。

 类似资料:
  • 我有一个关于插件版本的问题。 当它生成带有目标的报告时: 这表明有很多库都有beta或alpha版本。 问题是,如果此插件的目标是显示每个依赖项的最新版本,我不想将beta/alpha版本用于生产代码。但我也不想手动搜索最后一个稳定版本。 我尝试过“comparisonMethod”选项:numeric、maven等,但都没有成功。 插件“版本”是否有任何想法来显示最新可用的依赖版本,但不包括be

  • 问题内容: 由于传递依赖关系,我的战争被xml-apis和xerces jar填充。我尝试按照参考页上有关maven-war- plugin的说明进行操作,但是它不起作用。 我究竟做错了什么 ?如果很重要,我发现我正在使用的maven-war-plugin版本为2.1-alpha-1 问题答案: 您可以将这些依赖项标记为已提供: 这样,maven会将它们添加到编译类路径中,但不会打包它们。假定它们

  • 试图从我的构建中提取文件夹,但以下操作不起作用: 有什么想法吗?

  • 那么如何防止插件jar进入war文件呢?多谢了。

  • 我正在使用“maven”插件将Gradle构建创建的工件上传到Maven中央存储库。我正在使用类似于以下任务的任务: 然而,此任务创建的POM文件不能正确报告在我的Gradle构建文件中被排除的依赖项。例如: 如何在生成的POM文件中正确管理排除的依赖项?

  • 我已经读了一些关于这个、这个和这个的文章,但我找不到答案。使用Android Studio中的Gradle插件,我无法生成jacoco文件。exec(在任何子文件夹中均不包含*.exec)。 为了生成这个文件,我必须在build.gradle文件中设置什么? 注意:请记住,我使用的是Gradle插件(这是不同的)和Android Studio。