2

いくつかのxsdスキーマがあり、そのうちのいくつかは他のものをインポートします。そのため、他のファイルをインポートする一部のxsdファイルでxjc (Ant タスクまたはコマンド ライン ツールのいずれか)を呼び出すときは常に、バインディング ファイルを渡して、インポートされたクラスが再度生成されないようにします (これらのクラスは既に生成されているため)。 「上流」スキーマ)。このソリューションは、この SO 投稿 (Blaise Doughan による回答)で説明されています。

このアプローチはxsd:complexTypeタイプでは機能しますが、 xsd:simpleTypeタイプでは機能しないようです。これを示すために、絞り込んだ例を次に示します。一方が他方をインポートする 2 つの非常に単純なスキーマがあるとします。

a.xsd   ---import-->  b.xsd

ファイルは次のとおりです。

a.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://example.a" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema">

   <xs:import namespace="http://example.b"
              schemaLocation="b.xsd"/>

</xs:schema>

b.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://example.b" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           xmlns:b="http://example.b" 
           elementFormDefault="qualified">

   <xs:simpleType name="ResourceType">
      <xs:restriction base="xs:string">
         <xs:enumeration value="alpha"/>
         <xs:enumeration value="beta"/>
      </xs:restriction>
   </xs:simpleType>

   <xs:complexType name="ResourceType2">
        <xs:sequence>
            <xs:element name="a" type="xs:integer"/>
        </xs:sequence>
   </xs:complexType>
</xs:schema>

したがって、基本的にa.xsdは何もせず、 b.xsdのみをインポートします。次のようにa.xsdでxjcを呼び出すと、次のようになります。

xjc -d output -p example.a -npa a.xsd 

あなたが得る:

output/
└── example
    └── a
        ├── ObjectFactory.java
        ├── ResourceType2.java
        └── ResourceType.java

そのため、インポートされたスキーマのファイルが生成されました。これは望ましくないため、次のバインディング ファイルを定義して渡します。

import-bindings.xml

<jxb:bindings 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
    version="2.1">

    <jxb:bindings schemaLocation="b.xsd">
        <jxb:bindings node="//xs:simpleType[@name='ResourceType']">
            <jxb:class ref="example.b.ResourceType"/>
        </jxb:bindings>
        <jxb:bindings node="//xs:complexType[@name='ResourceType2']">
            <jxb:class ref="example.b.ResourceType2"/>
        </jxb:bindings>
    </jxb:bindings>
</jxb:bindings>

ただし、次のように-bオプションを使用してa.xsdxjcを再度呼び出すと、次のようになります。

xjc -d output -p a.example a.xsd -b imported-bindings.xml 

出力ディレクトリに次のように表示されます。

output/
└── example
    └── a
        ├── ObjectFactory.java
        └── ResourceType.java

つまり、xsd:complexType "ResourceType2" の生成は確かに抑制されましたが、xjcは先に進み、インポートされたxsd:simpleType "ResourceType"のコードを生成しました。何か案は?

更新自動生成されたエピソードファイル を使用する回避策を除いて、これはまだ機能していません。

4

1 に答える 1