JAXB - 创建重用模块JAXB - 创建重用模块(JAXB - Creating modul

2019-05-12 08:25发布

是否JAXB支持模块化的代码生成?

大多数我的背景是为JIBX XML编组,但对于传统我们公司正在使用JAXB的原因。

一个功能,是适用于JIBX是模块化的代码生成 。 说我有一个主要的模式,但我有该架构几种不同的信封。 随着JIBX我可以创建一个jar文件出来JibX'ed核心架构,然后在不同的项目,我可以JIBX我的信封模式,只是指向共享罐子,而不必重复代码生成的核心模式的每个信封。

我还不明白的方式为JAXB来处理这一点 - 有没有人成功做这样的事情?

在此先感谢,罗伊

Answer 1:

对于JAXB RI ,一个与“小插曲”文件处理(这些都是真的只是自定义文件)。 第一处理核心架构,确保有XJC使用-episode <file> ARG。 包处理的结果与在情节文件的JAR文件META-INF/sun-jaxb.episode 。 然后,通过该JAR文件作为ARG处理其他模式时来XJC。



Answer 2:

使用JAXB 2.1实现(新城的EclipseLink莫西 ,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

现在,如果我们运行与出绑定文件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)生成的代码是相同的。 你可以简单地丢弃在包含直接生成的代码项目的间接和点生成的代码。



文章来源: JAXB - Creating modules for reuse
标签: jaxb jibx oxm