我有一个CommonTypes.xsd,我使用xs:include包含在我的所有其他XSD中。我得到了
Multiple <schemaBindings> are defined for the target namespace ""
当我尝试使用绑定文件将其编译到不同的包中时。请告诉我是否有办法将它们编译成不同的包。我正在使用jaxb 2.1
答案 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>