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