Я пытался использовать JAXB-RI, и это xjc для создания классов для моих XSD (когда я говорю свои XSD, я имею в виду ужасно сделанные XSD. Подробнее об этом позже).
Первая проблема, с которой я столкнулся, это то, что у меня всего два пространства имен во всей настройке. Несмотря на это, одна и та же вещь определяется несколько раз в отдельных файлах с немного разными именами, но в XSD нечего различать. Например, у меня может быть два 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>
Итак, одно и то же имя, одно и то же пространство имен, просто разные файлы. Я обхожу это, указав два разных пакета, поэтому 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 эпизодов, xjc умрет. Я попытался поместить эпизоды в файл jar, а затем понял, что таким образом он ищет только один эпизод. Если я попытаюсь объединить содержимое эпизодов в один файл, это тоже не сработает.
Я могу что-то сделать, или я застрял здесь?