maven-jaxb2-plugin, повторно использующий XSD в общем проекте

У меня есть проект, который имеет схему A и B, оба в одном и том же пространстве имен. Оба импортируют схему C, которая также использует одно и то же пространство имен. Как я могу сгенерировать классы JAXB для A и B для разделения пакетов, одновременно используя повторно классы JAXB из C, сгенерированные для пакета commons?

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

Вот пример:

<plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <version>0.12.3</version>
    <executions>
        <execution>
            <id>generate-sources-C</id>
            <goals>
                <goal>generate</goal>
            </goals>
            <configuration>
                <generatePackage>com.mymodel.commons</generatePackage>
                <generateDirectory>${project.build.directory}/generated-sources/xjc-commons</generateDirectory>
                <schemas>
                    <schema><url>src/main/resources/xsd/mymodel/c.xsd</url></schema>
                </schemas>
            </configuration>
        </execution>
        <execution>
            <id>generate-sources-A</id>
            <goals>
                <goal>generate</goal>
            </goals>
            <configuration>
                <generatePackage>com.mymodel.a</generatePackage>
                <schemas>
                    <schema><url>src/main/resources/xsd/mymodel/a.xsd</url></schema>
                </schemas>
            </configuration>
        </execution>
        <execution>
            <id>generate-sources-B</id>
            <goals>
                <goal>generate</goal>
            </goals>
            <configuration>
                <generatePackage>com.mymodel.b</generatePackage>
                <schemas>
                    <schema><url>src/main/resources/xsd/mymodel/b.xsd</url></schema>
                </schemas>
            </configuration>
        </execution>
    </executions>
</plugin>

Это вызывает создание файла эпизода в:

target/generated-sources/xjc-commons/META-INF/sun-jaxb.episode

Как мне обратиться к этому файлу эпизодов /привязок в исполнениях для A и B? Использование эпизодов только упоминает, как обращаться к файлу эпизода из другие зависимости jar (или я просто не правильно понял, что более вероятно).

Я видел более старый ответ, предлагающий передать его в качестве параметра -b к XJC, но это, похоже, ничего не сделало для меня. Я до сих пор получаю тот же класс из C, сгенерированный три раза.

4 голоса | спросил Benny Bottema 4 Maypm18 2018, 16:27:56

1 ответ


0
Отказ от ответственности: я являюсь автором maven-jaxb2-plugin .показать вопросы с тегом 'maven-jaxb2-plugin'TL; DR вот тестовый проект, который демонстрирует, как это сделать.Это возможно, но немного волосато, поэтому, пожалуйста, потерпите меня.Если ---- +: = 0 =: + ---- , ---- +: = 1 =: + ---- и ---- +: = 2 =: + ---- находятся вто же пространство имен ---- +: = 3 =: + ---- и ---- +: = 4 =: + ---- не может импортировать ---- +: = 5 =: + -- , они могут только включать это.Мы хотим сгенерировать каждый из XSD в свой собственный пакет, скажем ---- +: = 6 =: + ---- , ---- +: = 7 =: + ---- и ----+: = 8 =: + ---- и сделать это в одном проекте Maven.Для этого нам понадобятся три отдельных выполнения ---- +: = 9 =: + ---- , каждое из которых настроено на собственную схему и целевой пакет.Например:Важно использовать разные целевые каталоги для отдельных исполнений .Хорошо, это создаст три целевых каталога с тремя целевыми пакетами.Следующая проблема заключается в том, что классы из ---- +: = 11 =: + ---- будут сгенерированы в ---- +: = 12 =: + ---- и ---- +: = 13 =:+ ---- чего мы хотим избежать.Чтобы добиться этого, мы должны указать XJC использовать классы из ---- +: = 14 =: + ---- для типов из ---- +: = 15 =: + ---- .Это фактически то, для чего предназначен файл эпизода .Этот файл обычно создается в ---- +: = 16 =: + ---- и содержит привязки для всех типов в обработанной схеме.Вот пример, сгенерированный для ---- +: = 17 =: + ---- :Файл эпизода на самом деле является обычным файлом привязок.Таким образом, вы можете напрямую использовать его в компиляции:Осталась только одна крошечная проблема.Файлы эпизодов, сгенерированные XJC, также содержат этот фрагмент:Это эффективно говорит " не генерировать код для схемы в данном пространстве имен".Это не будет проблемой, если ---- +: = 21 =: + ---- или ---- +: = 22 =: + ---- будет в другом пространстве имен.Но поскольку они находятся в одном и том же пространстве имен, этот фрагмент эффективно отключит генерацию кода для ---- +: = 23 =: + ---- или ---- +: = 24 =: + ----,Чтобы обойти это, мы можем постобработать ---- +: = 25 =: + ----, который был сгенерирован для ---- +: = 26 =: + ---- .Это можно сделать с помощью простого XSLT:Этот XSLT следует запускать после кода для ---- +: = 28 =: + ---- , но перед кодом для ---- +: = 29 =: + ---- и ----+: = 30 =: + ---- генерируется.Это может быть достигнуто путем помещения этих исполнений в разные фазы ( ---- +: = 31 =: + ---- , ---- +: = 32 =: + ---- , ---- +:= 33 =: + ---- ).Ниже приведен полный текст ---- +: = 34 =: + ---- :
ответил lexicore 4 Maypm18 2018, 21:57:31

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132