私は JAXB-RI を使用しようとしてきましたが、XSD 用のクラスを生成するのは xjc です (XSD と言うときは、恐ろしく完成した XSD を意味します。これについては後で詳しく説明します)。
最初の問題は、セットアップ全体で合計 2 つの名前空間しかないことです。それにもかかわらず、同じことが別々のファイルで複数回定義されており、名前はわずかに異なりますが、XSD には区別するものはありません。たとえば、2 つの XSD を持つことができます
bar_v01_00.xsd
<xsd:schema xmlns="http://www.foo.com/" targetNamespace="http://www.foo.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xsd:element name="foo">
<xsd:complexType>
<xsd:complexContent>
<xsd:element name="elem1" type="xsd:string" />
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
</xsd:schema>
bar_v02_00.xsd
<xsd:schema xmlns="http://www.foo.com/" targetNamespace="http://www.foo.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xsd:element name="foo">
<xsd:complexType>
<xsd:complexContent>
<xsd:element name="elem1" type="xsd:string" />
<xsd:element name="elem2" type="xsd:string" />
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
</xsd:schema>
つまり、同じ名前、同じ名前空間、ファイルが異なるだけです。これを回避するには、2 つの異なるパッケージを指定するので、bar_v01_00.xsd が入ります。
package www.foo.com.bar.Major01.Minor00;
bar_v02_00.xsd は次のようにコンパイルされます。
package www.foo.com.bar.Major02.Minor00;
確かにエレガントではありませんが、効果的です。現在、これらのファイルにはインクルード/インポートを含めることができ、それぞれにさらに多くのインクルード/インポートを含めることができ、そのうちのいくつかは 32 レベルの深さにすることができます! 概して、これらのインクルードには理由があります。つまり、何度も再利用されます。
私が所有しているサービスは 120 を超えており、それぞれに要求と応答の XSD があり、おそらく半分には上記のように複数のバージョンがあります。これをリファクタリングして合計 636 個のファイルにすることができましたが、これは並大抵のことではありませんでした。
同じ共通のものを個別のパッケージに 300 コピーしたくないので、.episode ファイルを使用してみました。それは機能しますが、レベル 3 相当のインクルードまでしかありません。3 つ以上の .episodes を含めようとすると、xjc が停止します。エピソードをjarファイルに入れてみたところ、そのように1つのエピソードしか見えないことに気付きました。エピソードのコンテンツを 1 つのファイルに結合しようとしても、うまくいきません。
私にできることはありますか、それともここで立ち往生していますか?