2

以下は、問題を示す絶対に自明で最小限の例です。次のインポート構成の3 つのスキーマ ファイル: A.xsdB.xsdC.xsd :

C.xsd ---------------- imports ----------------> A.xsd
  \                                          /  
   \---- imports ---> B.xsd --- imports ----/

したがって、A.xsdは C.xsd によって直接インポートされ、B.xsdを介して間接的にインポートされます。この問題は、カタログバインディング ファイルの両方が使用されている場合(空のファイルであっても)、 C.xsdでxjc (ver. 2.2.4 )を実行しようとすると発生します。

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>

バインディング.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.

アップデート

バグレポートを投稿しました。

4

2 に答える 2

1

Mac用のJDK 1.7.0_21-b12に付属のXJCを使用してあなたの例を実行しましたが、うまくいきました。ユースケースを機能させるには、JAXB 参照実装 ( https://jaxb.java.net/を参照)から新しいバージョンの XJC に切り替える必要はありません。

詳細については

于 2013-06-14T10:48:06.517 に答える
0

同じ問題ではないにしても、非常によく似た問題があります。回避策を見つけることができますか?jaxb-ri-2.2.7xjc 2.2.4-2 (OpenJDK 7u25)および でテスト済みjaxb-ri-2.2.1.1-4 of GlassFish

最も興味深いのは、publicカタログ エントリと組み合わせて schemaLocation なしでインポートを使用すると、すべてが機能することです。残念ながら、スキーマを調整することはできません。

ここに少し例があります。

失敗:

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns:test="http://www.test.com/1.0" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" targetNamespace="http://www.test.com/1.0" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <import namespace="http://www.w3.org/1999/xlink" schemaLocation="http://www.w3.org/1999/xlink.xsd"/>

    <element name="TestElement" type="test:TestType"/>
    <complexType name="TestType">
        <sequence>
            <element name="name" type="string"/>
        </sequence>
        <attribute ref="xlink:title" use="required"/>
    </complexType>
</schema>

働く:

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns:test="http://www.test.com/1.0" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" targetNamespace="http://www.test.com/1.0" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <import namespace="http://www.w3.org/1999/xlink"/>

    <element name="TestElement" type="test:TestType"/>
    <complexType name="TestType">
        <sequence>
            <element name="name" type="string"/>
        </sequence>
        <attribute ref="xlink:title" use="required"/>
    </complexType>
</schema>

カタログ ファイル (両方):

<!DOCTYPE catalog
    PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN"
           "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">

    <system
        systemId="http://www.w3.org/1999/xlink.xsd"
        uri="../schemas/xlink/1.0.0/xlinks.xsd"/>
    <public
        publicId="http://www.w3.org/1999/xlink"
        uri="../schemas/xlink/1.0.0/xlinks.xsd"/>

</catalog>

実行 (両方):

xjc schemas/xlink/1.0.0/xlinks.xsd schemas/test.xsd -b xjb/xlink.xjb -extension -d .build -catalog catalog/catalog.xml

于 2013-12-03T09:17:04.613 に答える