我正在尝试使用xjc
从几个特定的XSD生成Java类。这些模式有一些共同的定义,因此它们导入了许多常见的XSD。特别是,它们可以包括零到所有常见的XSD。
我想生成从特定XSD到特定包的所有类,但是将公共模式的生成类保存在公共包中,因此不会对源树中的每个特定模式重复这些类。
我了解到自定义绑定可用于基于每个模式指定包,例如:
<jxb:bindings schemaLocation="common1.xsd" node="/xsd:schema">
<jxb:schemaBindings>
<jxb:package name="mypackage.commonclasses"/>
</jxb:schemaBindings>
</jxb:bindings>
我有以下结构:
schemas
| - common
| | - common1.xsd --> XSD with common types #1
| | - ...
| | - commonN.xsd --> XSD with common types #N
| | - commonBindings.xjb --> Defines package "mypackage.commons" for common*.xsd
| - specific1
| | - specific1.xsd --> Includes ../common/common{1-N}.xsd
| | - specific1.xjb --> Defines package "mypackage.specific1" for specific1.xsd
| - specificN
| | - specificN.xsd --> Includes only ../common/common1.xsd
| | - specificN.xjb --> Defines package "mypackage.specificN" for specificN.xsd
一切正常:
xjc -b schemas/specific1
-b schemas/common
schemas/specific1/specific1.xsd
它会为specific1.xsd
中的mypackage.specific1
和mypackage.commons
中的公共类生成类。但是当我尝试为specificN
生成类时,xjc
会引发以下错误:
[ERROR] "file:/drive/dir/schemas/common/common1.xsd" is not a part of
this compilation. Is this a mistake for "/drive/dir/schemas/common/commonBindings.xjb"?
line 2 of file:/drive/dir/schemas/common/commonBindings.xjb
对于未在任何特定xsd中导入的每个常见XSD,我都会重复此错误。
有什么方法可以让xjc
忽略commonBindings.xjb
中未在XSD中使用的绑定我正在为其生成类?
或者,我是否通过使用这种方法瞄准了错误的方向,例如,应该使用特定xsd中的注释?如果可能的话,我想避免修改模式。
答案 0 :(得分:3)
我认为您需要的是使用JAXB剧集。请参阅this SO post,看看@BlaiseDoughan提供的答案。
在您的情况下,首先运行xjc,使用自定义绑定文件进行包名称自定义,针对所有常见的XSD,生成剧集文件和常用Java类。
然后通过引用第一次运行的剧集文件,再次使用xjc和其他所需的XSD。