Используя плагин maven jaxb2, модульная компиляция с использованием эпизода и каталога выдает ошибку неверного URL

Мой проект содержит A.xsd, который импортирует следующую схему из B.xsd, который является частью другого проекта:

<xsd:import namespace="http://com.test.schema/common/Context" schemaLocation="http://com.test.schema/common/Context/B.xsd"/>

Я пытаюсь использовать эпизод из проекта, который содержит B.xsd, чтобы классы, связанные с B.xsd, не перегенерировались при разборе A.xsd. Поэтому я сослался на это и это, чтобы придумать следующую конфигурацию: Вот pom.xml

    <dependencies>
        <dependency>
            <groupId>com.bar.foo</groupId>
            <artifactId>schema-b</artifactId>
            <version>1.2</version>
        </dependency>
    <dependencies>
    .
    .
    .
    .
    .
    <build>
        <plugins>
        <dependency>
            <plugin>
                <groupId>org.jvnet.jaxb2.maven2</groupId>
                <artifactId>maven-jaxb2-plugin</artifactId>
                <version>0.13.0</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                        <configuration>
                            <extension>true</extension>
                            <episodes>
                                <episode>
                                    <groupId>com.bar.foo</groupId>
                                    <artifactId>schema-b</artifactId>
                                </episode>
                            </episodes>
                            <catalog>src/main/resources/catalog.cat</catalog>
                            <schemas>
                                <schema>

                                    <fileset>
                                        <directory>${basedir}/src/main/schemas</directory>
                                        <includes>
                                            <include>A.xsd</include>
                                            <include>...</include>
                                            <include>...</include>
                                        </includes>
                                    </fileset>
                                </schema>
                            </schemas>
                            <bindingDirectory>${basedir}/src/main/schemas</bindingDirectory>
                            <bindingIncludes>
                                <include>*.xjb</include>
                            </bindingIncludes>
                            <args>
                                <arg>-Xannotate</arg>
                            </args>
                            <plugins>
                                <plugin>
                                    <groupId>org.jvnet.jaxb2_commons</groupId>
                                    <artifactId>jaxb2-basics</artifactId>
                                    <version>0.6.0</version>
                                </plugin>
                                <plugin>
                                    <groupId>org.jvnet.jaxb2_commons</groupId>
                                    <artifactId>jaxb2-basics-annotate</artifactId>
                                    <version>0.6.0</version>
                                </plugin>
                            </plugins>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

Вот файл каталога:

PUBLIC "http://com.test.schema/common/Context" "maven:com.bar.foo:schema-a:jar::1.2!"

В файле xjb есть некоторая конфигурация, чтобы убедиться, что XmlRootElement записан в некоторые сгенерированные классы:

<jxb:bindings xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
jxb:version="2.1" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
xmlns:annox="http://annox.dev.java.net" extensionBindingPrefixes="xjc">
<jxb:globalBindings>
    <xjc:simple />
</jxb:globalBindings>   
<jxb:bindings
    schemaLocation="A.xsd">
    <jxb:bindings node="//xsd:complexType[@name='ADataType']">
        <jxb:class name="AData" />
        <annox:annotate>
            <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement"
                name="AData" />
        </annox:annotate>
    </jxb:bindings>
</jxb:bindings>

Несмотря на предоставление эпизода для выполнения xjc и расположения схемы для B.xsd в файле каталога, классы для B.xsd генерируются.

Проблема в том, что артефакт maven, указанный в файле каталога, не обнаруживается. Я вижу следующую ошибку в журналах сборки maven:

Malformed URL on system identifier: maven:com.bar.foo:schema-b:jar::1.2!
PUBLIC: http://com.test.schema/common/Context
maven:com.bar.foo:schema-a:jar::1.2!

Может кто-нибудь помочь мне сказать, почему я нажимаю эту ошибку неверного URL для артефакта, который содержит B.xsd? Любая помощь будет по достоинству оценена.

1 ответ

Решение

Отказ от ответственности: я автор плагина maven-jaxb2-.

Во-первых, вы, вероятно, смешиваете A а также B Вот. Ты говоришь A импорт B но тогда вы используете schema-a Артефакт как эпизод. Если B импортируется, вы должны использовать schema-b как эпизод, чтобы не регенерировать B вещи при компиляции A,

Но я думаю, что это, вероятно, небольшая ошибка в этом вопросе.

У вас есть аспекты здесь - эпизоды и каталоги.

Эпизоды позволяют вам пропустить создание классов, которые вы уже сгенерировали где-то еще. Так что если вы используете schema-b артефакт при компиляции schema-a тогда XJC не должен генерировать классы для schema-b, Для этого вам не нужны каталоги, это независимо.

Иногда XJC все еще генерирует немного остатков - даже если вы используете эпизод. Я часто получаю ObjectFactory и, возможно, сгенерированы некоторые перечисления или элементы верхнего уровня. Я считаю, что это проблема в XJC, я ничего не могу с этим поделать в плагине maven-jaxb2-plugin.
Так что в качестве обходного пути я просто использую maven-antrun-plugin удалить ненужные сгенерированные вещи.

Если вы получите все B материал генерируется, то вы должны проверить, если schema-b артефакт действительно сгенерирован файл эпизода. Проверьте, есть ли у вас META-INF/sun-jaxb.episode внутри банки Смотрите этот ответ для некоторых пустяков в файле эпизода.

Так что, если вы правильно настроите правильный артефакт эпизода, вы не должны получить B Сгенерированные вещи, для этого вам не нужны каталоги.

Вам нужен каталог, чтобы не скачивать http://com.test.schema/common/Context/B.xsd при компиляции. Вы можете использовать каталоги, чтобы указать другое местоположение. Я думаю, что ваша проблема здесь в том, что вы ссылаетесь http://com.test.schema/common/Context в maven:com.bar.foo:schema-a:jar::1.2! который явно не указывает на ресурс схемы.

Если у вас есть импорт, как

<xsd:import namespace="http://com.test.schema/common/Context" schemaLocation="http://com.test.schema/common/Context/B.xsd"/>

Тогда вам, вероятно, следует переписать его следующим образом:

PUBLIC "http://com.test.schema/common/Context" "maven:com.bar.foo:schema-b:jar::1.2!/common/Context/B.xsd"

Если предположить, schema-b Артефакт содержит вашу схему под /common/Context/B.xsd, Обратите внимание, что он отображает пространство имен, а не расположение схемы.

Вы также можете использовать REWRITE_SYSTEM переписать расположение схемы. Например:

REWRITE_SYSTEM "http://com.test.schema" "maven:com.bar.foo:schema-b:jar::1.2!"

Если у вас есть URL, как http://com.test.schema/common/Context/B.xsdбудет переписано maven:com.bar.foo:schema-b:jar::1.2!/common/Context/B.xsd, Это будет указывать на ресурс /common/Context/B.xsd внутри вашего schema-b JAR.

Еще один совет - если вы используете schema-b как зависимость в вашем проекте, вы можете опустить версию.

Вот пример каталога из реального проекта:

https://github.com/highsource/ogc-schemas/blob/master/schemas/src/main/resources/ogc/catalog.cat

Он содержит переписывает как:

REWRITE_SYSTEM "http://schemas.opengis.net" "maven:org.jvnet.ogc:ogc-schemas:jar::!/ogc"
Другие вопросы по тегам