Java 当两个单独的模式具有相同的名称空间时,如何让JAXB在单独的包中生成类?

Java 当两个单独的模式具有相同的名称空间时,如何让JAXB在单独的包中生成类?,java,xml,xsd,namespaces,jaxb,Java,Xml,Xsd,Namespaces,Jaxb,我怀疑这个问题没有好的答案,但希望我遗漏了一些东西。假设我有两个单独的XML模式,它们都具有相同的名称空间,定义了一些重复的complexTypes,我想用JAXB为它们生成Java类。作为一个非常简单的例子: schema1.xsd: <?xml version="1.0" encoding="UTF-8"?> <xs:schema elementFormDefault="qualified" targetNamespace="namespace1" xmlns="names

我怀疑这个问题没有好的答案,但希望我遗漏了一些东西。假设我有两个单独的XML模式,它们都具有相同的名称空间,定义了一些重复的complexTypes,我想用JAXB为它们生成Java类。作为一个非常简单的例子:

schema1.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema elementFormDefault="qualified" targetNamespace="namespace1" xmlns="namespace1" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="foo" type="xs:string"/>
</xs:schema>
根据,我尝试在外部定制文件中指定包,如下所示:

<jaxb:bindings schemaLocation="schema1.xsd">
    <jaxb:schemaBindings>
        <jaxb:package name="package1"/>
    </jaxb:schemaBindings>
</jaxb:bindings>
<jaxb:bindings schemaLocation="schema2.xsd">
    <jaxb:schemaBindings>
        <jaxb:package name="package2"/>
    </jaxb:schemaBindings>
</jaxb:bindings>

但这不起作用——我后来意识到,上面链接的同样的文档说:

请注意,此自定义是按名称空间进行的。也就是说,即使您的模式被拆分为多个模式文档,如果它们都在同一名称空间中,您也不能将它们放入不同的包中

所以,我猜这是行不通的

对此有什么明智的办法吗?我怀疑正确的答案是模式应该在不同的名称空间中,因为这样可以解决问题,而且可能更有逻辑意义,但我对模式没有任何控制权——它们是由第三方提供的。我问过是否有可能改变它们,但我怀疑答案是否定的


我能看到的唯一的另一个选择是生成两次Java类,首先为schema1.xsd生成,然后为schema2.xsd生成,每次都使用它们自己的自定义文件指定不同的包,但这感觉像是一个非常笨拙的解决方案。还有什么比我更明智的选择吗?

你不能。包是基于名称空间生成的。相同的命名空间-相同的包


在这种情况下,你必须执行几次死刑。另外,请注意使用不同的输出生成目录(如
target/generated sources/xjc1
target/generated sources/xjc2
),否则“仅在任何内容发生更改时编译”将无法正常工作。

您不能。包是基于名称空间生成的。相同的命名空间-相同的包


在这种情况下,你必须执行几次死刑。另外,请注意使用不同的输出生成目录(如
target/generated sources/xjc1
target/generated sources/xjc2
),否则“仅在更改任何内容时编译”将无法正常工作。

这不是我想要的答案,但感谢您确认我的怀疑!关于不同输出目录的极好提示,谢谢。这不是我想要的答案,但是谢谢你证实我的怀疑!关于不同输出目录的精彩提示,谢谢。
[ant:xjc] [ERROR] 'foo' is already defined
[ant:xjc]   line 3 of file:/C:/dev/test/src/main/resources/schema2.xsd
[ant:xjc]
[ant:xjc] [ERROR] (related to above error) the first definition appears here
[ant:xjc]   line 3 of file:/C:/dev/test/src/main/resources/schema1.xsd
<jaxb:bindings schemaLocation="schema1.xsd">
    <jaxb:schemaBindings>
        <jaxb:package name="package1"/>
    </jaxb:schemaBindings>
</jaxb:bindings>
<jaxb:bindings schemaLocation="schema2.xsd">
    <jaxb:schemaBindings>
        <jaxb:package name="package2"/>
    </jaxb:schemaBindings>
</jaxb:bindings>