いくつかの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.xsdでxjcを再度呼び出すと、次のようになります。
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"のコードを生成しました。何か案は?
更新自動生成されたエピソードファイル を使用する回避策を除いて、これはまだ機能していません。