Компиляция эпизода JAXB с включением не работает

У меня есть 2 схемы A, B. Я повторно использую некоторые элементы A в B.

Я не использую пространства имен.

я использую

<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.9.0</version>

Я определил включение схемы A в схему B как:

<xs:include schemaLocation="classpath:my.schema.A.xsd"/>

и каталог как

REWRITE_SYSTEM "classpath:my.schema.A.xsd" "maven:my.schema:schema-a!/A.xsd"

Конфигурация jaxb идет:

<configuration>
    <generatePackage>my.schema.b</generatePackage>
    <schemaIncludes>
        <includes>B.xsd</includes>
    </schemaIncludes>
    <episodes>
        <episode>
            <groupId>my.schema</groupId>
            <artifactId>schema-a</artifactId>
        </episode>
    </episodes>
    <catalog>src/main/catalog/catalog.cat</catalog>
</configuration>

Проблема заключается в том, что всякий раз, когда я указываю зависимость эпизода, схема не генерирует никаких классов, даже если она содержит некоторые элементы B, для которых я хочу создать классы.

[INFO] Parsing input schema(s)...
[INFO] Compiling input schema(s)...
[INFO] Cleaning package directories.
[INFO] Finished execution.

Когда я удаляю эпизод, он работает хорошо и генерирует классы для схемы A, чего я действительно хочу избежать.

У вас есть какие-нибудь предложения?

Образец был опубликован в эпизодическом сборнике Jaxb

2 ответа

Решение

Хорошо, я проверил ваш пример. Проблема в том, что вы не используете пространства имен.

Проверьте свои META-INF/sub-jaxb.episode файл:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxb:bindings version="2.1" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb">
  <jaxb:bindings scd="x-schema::">
    <jaxb:schemaBindings map="false">
      <jaxb:package name="schema.episode.a"/>
    </jaxb:schemaBindings>
    <jaxb:bindings scd="person">
      <jaxb:class ref="schema.episode.a.Person"/>
    </jaxb:bindings>
  </jaxb:bindings>
</jaxb:bindings>

Ты видишь это <jaxb:bindings scd="x-schema::"> а потом <jaxb:schemaBindings map="false">, Это в основном говорит XJC "не отображать ничего в пустом пространстве имен". Так как ваша вторая схема (b.xsd) также не использует пространства имен, когда вы используете a.xsdФайл эпизода (связывание выше), вы подавляете генерацию кода для b.xsd также.

Подводя итог, можно сказать, что при использовании эпизодов / отдельных схем компиляции нельзя помещать схемы с одним пространством имен в разные эпизоды. Это как раз проблема с include,

Это не ошибка в maven-jaxb2-plugin, Я бы также не назвал это ошибкой в ​​XJC. Это просто, как эпизоды работают по умолчанию.

Посмотрите мой запрос на получение здесь, он демонстрирует эпизодическую компиляцию, когда пространства имен обрабатываются соответствующим образом.

Автор maven-jaxb2-plugin Вот.

Я думаю, что ваш эпизод говорит что-то вроде "не компилировать пространства имен A и B". Пожалуйста, проверьте файл привязки внутри META-INF в вашем банке.

Это довольно сложное использование, есть много моментов, где это может пойти не так. Ты используешь:

  • каталоги
  • Разрешение схемы на основе артефактов Maven
  • эпизоды

Каталоги и эпизоды являются функциями XJC, разрешение Maven исходит от maven-jaxb2-plugin, Мы должны попытаться выделить то, что не получается:

  • Попробуйте только с эпизодами - извлеките свои схемы и скомпилируйте "как есть", без каталогов и распознавателя.
  • Просто каталоги - извлекайте схему и переписывайте в локальные каталоги вместо maven:
  • Пытаться maven:my.schema:schema-a!/A.xsd как схема расположения без эпизодов и каталогов

Очевидно, еще три комбинации, чтобы попробовать.

Если вы предоставите пример проекта, я проведу расследование (но не в течение следующих 10 дней). Лучше всего подать вопрос. Я перенесу плагин на GitHub, так что это будет хорошее место:

https://github.com/highsource/maven-jaxb2-plugin

Другие вопросы по тегам