【问题标题】:JAXB - Creating modules for reuseJAXB - 创建模块以供重用
【发布时间】:2011-05-03 12:38:15
【问题描述】:

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

我的大部分背景是使用 JibX 进行 XML 编组,但由于遗留原因,我们公司正在使用 JAXB。

可用于 JIBX 的一项功能是 modular code generation。假设我有一个主模式,但该模式有几个不同的信封。使用 JibX,我可以从 JibX 的核心模式中创建一个 jar 文件,然后在单独的项目中,我可以 JibX 我的信封模式并简单地指向共享 jar,而不必为每个信封复制核心模式的代码生成.

我还没有看到 JAXB 处理这个问题的方法 - 有没有人成功地做这样的事情?

提前致谢, 罗伊

【问题讨论】:

    标签: jaxb jibx oxm


    【解决方案1】:

    对于JAXB RI,这是使用“情节”文件处理的(这些实际上只是自定义文件)。首先处理核心模式,确保 xjc 使用 -episode <file> 参数。将该处理的结果打包到一个 JAR 文件中,其中包含 META-INF/sun-jaxb.episode 中的剧集文件。然后,在处理其他模式时将该 JAR 文件作为 arg 传递给 xjc。

    【讨论】:

    【解决方案2】:

    使用 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
    

    imported-bindings.xml

    您可以使用 JAXB 绑定文件来指定 import.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 imports.xsd)和间接(xjc root.xsd)生成的代码是相同的。您可以简单地删除间接生成的代码,并指向包含直接生成的代码的项目。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    相关资源
    最近更新 更多