JAXB - Создание модулей для повторного использования - PullRequest
7 голосов
/ 03 мая 2011

Поддерживает ли JAXB генерацию модульного кода?

Большая часть моей работы связана с JibX для сортировки XML, но по унаследованным причинам наша фирма использует JAXB.

Одна функция, которая была доступна для JIBXбыла модульная генерация кода .Скажем, у меня есть основная схема, но у меня есть несколько различных конвертов для этой схемы.С помощью JibX я мог создать файл jar из базовой схемы JibX, а затем в отдельных проектах я мог JibX мои схемы конвертов и просто указывал на общий jar вместо того, чтобы дублировать генерацию кода основных схем для каждого конверта.

Я пока не вижу способа для JAXB справиться с этим - кто-нибудь успешно делал что-то подобное?

Заранее спасибо, Рой

Ответы [ 2 ]

9 голосов
/ 03 мая 2011

Для JAXB RI , который обрабатывается файлами эпизодов (на самом деле это просто файлы настроек). Сначала обработайте базовую схему, убедившись, что xjc использует аргумент -episode <file>. Упакуйте результаты этой обработки в файл JAR с файлом эпизода в META-INF/sun-jaxb.episode. Затем передайте этот JAR-файл в качестве аргумента xjc при обработке других схем.

3 голосов
/ 03 мая 2011

Используя реализацию 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 для генерации классов Java из схемы XML:

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, чтобы указать, что типы из файла 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 import.xsd) и косвенно (xjc root.xsd), одинаков. Вы можете просто отбросить сгенерированный косвенно код и указать на проект, содержащий код, сгенерированный напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...