Используя плагин 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>

Inspite of providing the episode to the xjc execution and the location of the schema for B.xsd in the catalog file, the classes for B.xsd is getting generated.

Проблема в том, что артефакт 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? Любая помощь будет действительно оценена.


person Shrinidhi Achar    schedule 01.10.2015    source источник


Ответы (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 внутри JAR. См. этот ответ для некоторых мелочей в файле эпизода.

Таким образом, если вы правильно настроите правильный артефакт эпизода, вы не должны получить 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"
person lexicore    schedule 02.10.2015
comment
Спасибо вам большое за ваш ответ. Да, в описании была опечатка. Я имел в виду схему-б. - person Shrinidhi Achar; 02.10.2015
comment
Ты прав. Я проверил файл эпизода, и привязки для класса, который я пытался повторно использовать, отсутствовали. Я понял, что вы объяснили о каталоге. Но по второй ссылке, которую я разместил в своем описании, в которой говорится об эпизодах, я понял, что нужны каталоги. Я цитирую предложение из блога. Обратите внимание, что JAXB по-прежнему необходимо получить доступ к схемам BOTH A и B во время компиляции. И вы, вероятно, не хотите вручную копировать или дублировать схемы. - person Shrinidhi Achar; 02.10.2015
comment
@ShrinidhiAchar Ну, я автор этого документа (2-я ссылка). Да, XJC нужен доступ к обеим схемам, но нет, для этого вам не обязательно нужны эпизоды. Но рекомендуется, чтобы вам не нужно было обращаться к внешним ресурсам во время сборки. - person lexicore; 02.10.2015