使用JAXB 2.1将多个模式编译到不同的包中

时间:2010-05-04 11:07:29

标签: jaxb

我有一个CommonTypes.xsd,我使用xs:include包含在我的所有其他XSD中。我得到了

Multiple <schemaBindings> are defined for the target namespace ""

当我尝试使用绑定文件将其编译到不同的包中时。请告诉我是否有办法将它们编译成不同的包。我正在使用jaxb 2.1

5 个答案:

答案 0 :(得分:6)

是的,有办法 假设:

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的{​​{1}}与targetNameSpace的{​​{1}}不同。

答案 1 :(得分:6)

如Ben已经说明的那样,如果它们具有相同的命名空间,则无法做到这一点。 但是如果你有不同的命名空间怎么做呢?

<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,因为这将覆盖您的配置。

答案 2 :(得分:4)

我遇到了同样的问题并且尚未解决,但我担心无法将XSD生成到不同的软件包中:

  

拥有多个&lt; jaxb:schemaBindings&gt;是不合法的。每个命名空间,因此不可能在编译到不同Java包中的同一目标命名空间中有两个模式

来自Compiler Restrictions at the end of this page

但如果有人找到一些解决方法,请告知我们

答案 3 :(得分:3)

我知道这是一篇旧帖子,但由于确切的问题没有答案,这是我的建议:

正如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" >

而不是,您需要在XSD的targetNamespace标记中添加xs:schema属性

<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>

答案 4 :(得分:0)

如果具有多个具有不同配置的模式,则可以按照jaxb maven插件使用页面中所述进行操作。

可以为每个架构配置单独的程序包。

<packageName>se.west</packageName>

完整的示例配置如下:

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>${project.version}</version>
<executions>
    <execution>
        <id>xjc-schema1</id>
        <goals>
            <goal>xjc</goal>
        </goals>
        <configuration>
            <!-- Use all XSDs under the west directory for sources here. -->
            <sources>
                <source>src/main/xsds/west</source>
            </sources>

            <!-- Package name of the generated sources. -->
            <packageName>se.west</packageName>
        </configuration>
    </execution>
    <execution>
        <id>xjc-schema2</id>
        <goals>
            <goal>xjc</goal>
        </goals>
        <configuration>
            <!-- Use all XSDs under the east directory for sources here. -->
            <sources>
                <source>src/main/xsds/east</source>
            </sources>

            <!-- Package name of the generated sources. -->
            <packageName>se.east</packageName>

            <!--
                Don't clear the output directory before generating the sources.
                Clearing the output directory removes the se.west schema from above.
            -->
            <clearOutputDir>false</clearOutputDir>
        </configuration>
    </execution>
</executions>