6

我有 2 个模式 A、B。我在 B 中重用了一些 A 元素。

我不使用命名空间。

我在用着

<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.9.0</version>

我已将架构 B 中包含的架构 A 定义为:

<xs:include schemaLocation="classpath:my.schema.A.xsd"/>

目录为

REWRITE_SYSTEM "classpath:my.schema.A.xsd" "maven:my.schema:schema-a!/A.xsd"

jaxb 配置如下:

<configuration>
    <generatePackage>my.schema.b</generatePackage>
    <schemaIncludes>
        <includes>B.xsd</includes>
    </schemaIncludes>
    <episodes>
        <episode>
            <groupId>my.schema</groupId>
            <artifactId>schema-a</artifactId>
        </episode>
    </episodes>
    <catalog>src/main/catalog/catalog.cat</catalog>
</configuration>

问题是,每当我指定剧集依赖项时,模式不会生成任何类,即使它包含一些我想要为其生成类的 B 元素。

[INFO] Parsing input schema(s)...
[INFO] Compiling input schema(s)...
[INFO] Cleaning package directories.
[INFO] Finished execution.

当我删除这一集时,它运行良好并为模式 A 生成类——我确实想避免这种情况。

你有什么建议吗?

在Jaxb 情节汇编中发布了一个样本

4

2 回答 2

5

好的,我已经检查了您的示例。问题是您不使用名称空间。

检查您的META-INF/sub-jaxb.episode文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxb:bindings version="2.1" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb">
  <jaxb:bindings scd="x-schema::">
    <jaxb:schemaBindings map="false">
      <jaxb:package name="schema.episode.a"/>
    </jaxb:schemaBindings>
    <jaxb:bindings scd="person">
      <jaxb:class ref="schema.episode.a.Person"/>
    </jaxb:bindings>
  </jaxb:bindings>
</jaxb:bindings>

你看到这个<jaxb:bindings scd="x-schema::">然后<jaxb:schemaBindings map="false">。这基本上告诉 XJC“不要在空的命名空间中映射任何东西”。由于您的第二个架构 ( b.xsd) 也不使用名称空间,因此当您使用a.xsd的剧集文件(上面的绑定)时,您也会抑制代码的生成b.xsd

总而言之,当使用剧集/单独的模式编译时,您不能将具有一个命名空间的模式放入不同的剧集中。这正是include.

这不是maven-jaxb2-plugin. 我也不会称其为 XJC 中的错误。这就是剧集默认的工作方式。

在此处查看我的拉取请求,它演示了在相应地处理命名空间时的分段编译。

于 2014-09-11T07:44:16.953 回答
0

这里的作者maven-jaxb2-plugin

我的猜测是你的情节说的是“不要编译命名空间 A 和 B”。META-INF请检查JAR 中的绑定文件。

这是非常高级的用法,有很多地方可能会出错。你用:

  • 目录
  • 基于 Maven 工件的架构解析
  • 剧集

目录和剧集是 XJC 特性,Maven 解析来自maven-jaxb2-plugin. 我们应该尝试找出失败的地方:

  • 仅使用剧集尝试 - 提取您的模式并“按原样”编译,无需目录和解析器
  • 只是目录 - 提取模式并重写到本地目录而不是maven:
  • 尝试maven:my.schema:schema-a!/A.xsd作为没有剧集和目录的模式位置

显然要尝试另外三种组合。

如果您提供示例项目,我会进行调查(但不会在接下来的 10 天内)。最好的办法是提出问题。我会将插件移动到 GitHub,所以这将是一个好地方:

https://github.com/highsource/maven-jaxb2-plugin

于 2014-09-08T17:11:49.903 回答