Компиляция нескольких схем в разные пакеты с использованием JAXB 2.1
У меня есть CommonTypes.xsd, который я включаю в мои другие XSD, используя xs: include. Я получаю
Multiple <schemaBindings> are defined for the target namespace ""
когда я пытаюсь скомпилировать его в разные пакеты с использованием файлов привязки. Скажите, пожалуйста, есть ли способ скомпилировать их в разные пакеты. Я использую jaxb 2.1
Ответы
Ответ 1
Да, есть способ.
Предполагая, что:
xsd/common/common.xsd
xsd/foo/foo.xsd
В общей папке common.xjb
:
<jxb:schemaBindings>
<jxb:package name="mypkg.common">
</jxb:package>
</jxb:schemaBindings>
В папке каталога foo foo.xjb
:
<jxb:schemaBindings>
<jxb:package name="mypkg.foo">
</jxb:package>
</jxb:schemaBindings>
В файле build.xml
создайте одну задачу xjc для каждого:
<xjc destdir="${app.src}" readOnly="true" package="mypkg.common">
<schema dir="${app.schema}/common" includes="*.xsd" />
<binding dir="${app.schema}/common" includes="*.xjb" />
</xjc>
<xjc destdir="${app.src}" readOnly="true" package="mypkg.foo">
<schema dir="${app.schema}/foo" includes="*.xsd" />
<binding dir="${app.schema}/foo" includes="foo.xjb" />
</xjc>
Вам нужно убедиться, что common.xsd
имеет targetNameSpace
, который отличается от foo.xsd
targetNameSpace
.
Ответ 2
Как уже было сказано Бен, нет способа сделать это, если они имеют одинаковое пространство имен.
Но как это сделать, если у вас разные пространства имен?
<jxb:bindings xmlns:jxb="http://java.sun.com/xml/ns/jaxb" version="2.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
<jxb:bindings namespace="http://www.openapplications.org/oagis/9/unqualifieddatatypes/1.1" schemaLocation="oagi/Common/UNCEFACT/ATG/CoreComponents/UnqualifiedDataTypes.xsd" >
<jxb:schemaBindings>
<jxb:package name="com.test.oagi.udt"/>
</jxb:schemaBindings>
</jxb:bindings>
<jxb:bindings namespace="http://www.openapplications.org/oagis/9/codelists" schemaLocation="oagi/Common/OAGi/Components/CodeLists.xsd" >
<jxb:schemaBindings>
<jxb:package name="com.test.oagi.cl"/>
</jxb:schemaBindings>
</jxb:bindings>
</jxb:bindings>
но убедитесь, что вы не используете параметр командной строки -p, так как это переопределит вашу конфигурацию.
Ответ 3
Я встречаюсь с той же проблемой и еще не решил ее, но я боюсь, что невозможно создать XSD в разные пакеты:
Нельзя иметь более одного < jaxb: schemaBindings > для пространства имен, поэтому невозможно иметь две схемы в одном и том же пространстве имен задач, скомпилированные в разные пакеты Java
from Ограничения компилятора в конце этой страницы
но если кто-то найдет какую-то работу, просто сообщите нам, пожалуйста.
Ответ 4
Я знаю, что это старый пост, но, поскольку ответа на конкретный вопрос нет, вот мое предложение:
Как пояснил mmoossen, трюк заключается в том, чтобы указать разные пространства имен для XSD.
Но добавление атрибута namespace
в тег jxb:bindings
не работает:
<jxb:bindings namespace="http://www.openapplications.org/oagis/9/unqualifieddatatypes/1.1" schemaLocation="oagi/Common/UNCEFACT/ATG/CoreComponents/UnqualifiedDataTypes.xsd" >
Вместо этого вам нужно добавить атрибут targetNamespace
к тегам xs:schema
ваших XSD:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified"
targetNamespace="some.namespace"
version="1.0">
После выполнения вы сможете иметь 1 внешний файл настройки (.xjb), объявляющий другой schemaBindings
, каждый из которых возможно , используя другой пакет
<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings version="2.1"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd"
jaxb:extensionBindingPrefixes="xjc annox inherit">
<jaxb:bindings schemaLocation="MyFirstXSD.xsd">
<jaxb:schemaBindings>
<jaxb:package name="com.test.a" />
</jaxb:schemaBindings>
</jaxb:bindings>
<jaxb:bindings schemaLocation="MySecondXSD.xsd">
<jaxb:schemaBindings>
<jaxb:package name="com.test.b" />
</jaxb:schemaBindings>
</jaxb:bindings>
<jaxb:bindings schemaLocation="MyThirdXSD.xsd">
<jaxb:schemaBindings>
<jaxb:package name="com.test.c" />
</jaxb:schemaBindings>
</jaxb:bindings>
</jaxb:bindings>