Компиляция нескольких схем в разные пакеты с использованием 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>