下面是演示该问题的绝对微不足道的最小示例。 以下导入配置中的三个架构文件:A.xsd、B.xsd、C.xsd:
C.xsd ---------------- imports ----------------> A.xsd
\ /
\---- imports ---> B.xsd --- imports ----/
因此 A.xsd 由 C.xsd 直接导入,并再次通过 B.xsd 间接导入。尝试在 C.xsd 上运行 xjc(ver. 2.2.4)时出现问题目录和使用绑定(bind)文件(即使是空文件)。
A.xsd
<schema targetNamespace="foo://a"
xmlns="http://www.w3.org/2001/XMLSchema">
<simpleType name="year">
<restriction base="dateTime">
<pattern value="\d{4}"/>
</restriction>
</simpleType>
</schema>
B.xsd
<schema targetNamespace="foo://b"
xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="foo://a" schemaLocation="boo://a.xsd"/>
</schema>
C.xsd
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="foo://c">
<import namespace="foo://a" schemaLocation="A.xsd"/>
<import namespace="foo://b" schemaLocation="B.xsd"/>
</schema>
目录.xml
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
<system systemId="boo://a.xsd" uri="A.xsd"/>
</catalog>
绑定(bind).xjb
<bindings xmlns="http://java.sun.com/xml/ns/jaxb" version="2.1"/>
给定上述文件,所有文件都放在同一目录中,以下调用成功:
xjc -d src -extension -catalog catalog.xml C.xsd
而下面的调用:
xjc -d src -extension -catalog catalog.xml C.xsd -b bindings.xjb
...失败并出现类似错误的消息(指向某些内部困惑?):
parsing a schema...
[ERROR] 'year' is already defined
line 8 of file:/home/brutus/A.xsd
[ERROR] (related to above error) the first definition appears here
line 3 of file:/home/brutus/A.xsd
Failed to parse a schema.
更新
发布了一个bug report .
最佳答案
我使用适用于 Mac 的 JDK 1.7.0_21-b12 附带的 XJC 运行了您的示例,它运行良好。您应该只需要从 JAXB 引用实现(请参阅:https://jaxb.java.net/)切换不是较新版本的 XJC 即可让您的用例正常工作。
了解更多信息
关于java - 当 -binding 与 -catalog 一起使用时,JAXB xjc 解析失败(错误?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17055533/