JAXB是否支持模块化代码生成?
我的大部分背景都是使用JibX进行XML编组,但由于遗留原因,我们公司正在使用JAXB。
JIBX可用的一项功能是modular code generation。假设我有一个主模式但我有几个不同的信封用于该模式。使用JibX,我可以用JibX的核心模式创建一个jar文件,然后在单独的项目中,我可以JibX我的信封模式,只需指向共享jar,而不必复制每个信封的核心模式的代码生成
我还没有看到JAXB处理这个问题的方法 - 有没有人成功做过这样的事情?
提前致谢, 罗伊
答案 0 :(得分:9)
对于JAXB RI,用“情节”文件处理(这些只是自定义文件)。首先处理核心架构,确保xjc使用-episode <file>
arg。使用META-INF/sun-jaxb.episode
中的剧集文件将该处理的结果打包到JAR文件中。然后,在处理其他模式时将该JAR文件作为arg传递给xjc。
答案 1 :(得分:3)
使用JAXB 2.1实现(Metro,EclipseLink MOXy,Apache JaxMe等),您可以指定模式类型对应于现有类,以防止生成它们。
例如:
<强> root.xsd 强>
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.com/root">
<xsd:import schemaLocation="imported.xsd" namespace="http://www.example.com/imported"/>
<xsd:complexType name="root">
<xsd:attribute name="root-prop" type="xsd:string"/>
</xsd:complexType>
</xsd:schema>
<强> imported.xsd 强>
<?xml version="1.0"?>
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.example.com/imported"
targetNamespace="http://www.example.com/imported">
<xsd:complexType name="imported">
<xsd:attribute name="imported-prop" type="xsd:string"/>
</xsd:complexType>
</xsd:schema>
问题陈述
如果使用XJC工具从XML模式生成java类:
xjc -d out root.xsd
您生成以下内容:
com\example\imported\Imported.java
com\example\imported\ObjectFactory.java
com\example\imported\package-info.java
com\example\root\ObjectFactory.java
com\example\root\Root.java
com\example\root\package-info.java
<强>进口-bindings.xml 强>
您可以使用JAXB绑定文件来指定从imported.xsd指向现有类的类型:
<jxb:bindings
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
version="2.1">
<jxb:bindings schemaLocation="imported.xsd">
<jxb:bindings node="//xs:complexType[@name='imported']">
<jxb:class ref="com.example.imported.Imported"/>
</jxb:bindings>
</jxb:bindings>
</jxb:bindings>
运行XJC
现在,如果我们使用out bindings文件运行XJC:
xjc -d out -b imported-bindings.xml root.xsd
将不会生成绑定文件中指定的任何文件:
com\example\root\ObjectFactory.java
com\example\root\Root.java
com\example\root\package-info.java
替代方法
直接从导入的模式(xjc imported.xsd)和间接(xjc root.xsd)生成的代码是相同的。您可以简单地删除间接生成的代码,并指向包含直接生成的代码的项目。