我目前正在使用 Mojo Maven 插件“jaxb2-maven-plugin”使用 JAXB 生成的类来实现 Netbeans 平台应用程序的功能。不幸的是,XSD 文件的创建并不在我手中,而且它们是保密的。我试图提供一个最小的运行示例来进一步证明这一点,但现在我希望有人能够仅根据我的描述将我推向正确的方向。
我们有许多 XSD 文件,并在过去几周添加了一些内容。其中两个 XSD(我们称其为 A.xsd 和 B.xsd)包含另一个 XSD(我们称其为 common.xsd),其中包含其他两个 XSD 使用的通用类型。此 common.xsd 没有命名空间,并且应该保持这种状态。
这会产生以下问题:对于在此 common.xsd 中定义的类型,xjc 会生成三个重复项。一个驻留在名为“生成”的包中(正是我想要使用的类),另外两个驻留在 A.xsd 和 B.xsd 的包中,它们与“生成”中的类基本相同,除了一些命名空间之外我不需要。
通过阅读 Stackoverflow 上的其他一些问题,我了解到 Episodes 可以解决这个问题,但我无法让它在没有命名空间的情况下与 XSD 一起使用。
我的 POM 中的插件配置非常简单:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<configuration>
<npa>true</npa>
</configuration>
<executions>
<execution>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
</plugin>
是否可以使用具有特殊配置的剧集或某种可以用来解决此问题的绑定(bind)来解决此问题?
最佳答案
不幸的是,这是对剧集失败原因的解释,而不是对您问题的答案。
您可以使用 jaxb:class/@ref
绑定(bind)将架构类型映射到某个现有类。请参阅this post作者:布莱斯。
简而言之,您可以执行以下操作:
<jaxb:binding node="...point to your type here">
<jaxb:class ref="ExistingClass"/>
<jaxb:binding>
在这种情况下,ExistingClass
将被您的类型重用。
您正在尝试使其与剧集配合使用。 Episode,本质上就是这样的映射的集合。但剧集使用 SCD(架构组件指示符)来指向类型,而不是使用 XPath 表达式的 node
。 SCD 是命名空间驱动的。如果你没有命名空间 - 或者,更好地说 - 你有 chameleon namespace design ,那么你就没有正确的命名空间。因此剧集失败。
问题是你的“公共(public)”类应该使用“主机”模式的命名空间(这就是变色龙设计的目的)。命名空间和本地名称实际上是在注释中提供的。如果您只有一组类和一组注释 - 那么您就只有一个命名空间。因此,目前我没有看到一种简单的方法来只拥有一组“通用”类。
如果您可以单独使用 A
和 B
,即不同时在同一上下文中使用,那么就有可能欺骗注释阅读器将指定的命名空间用于common
。
但是如果你想同时使用A和B,我真的不知道该怎么做。也许您可以为 common
创建一个命名空间,然后应用一些预处理来用此命名空间替换 A 和 B 中公共(public)元素的命名空间...
所以这不是一个答案,更多的是对背景的阐述。
关于java - 防止从没有命名空间的 XSD 生成重复类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26274407/