Мой maven-jaxb2-plugin
поддерживает компиляция отдельной схемы.
Как это сделать:
- Добавьте свой артефакт
a
в качестве эпизода.
- If
a.xsd
is imported into b.xsd
, you have to make this schema available to JAXB when compiling b
:
- One way to do this is to extract
a.xsd
from the artifact a
using Maven dependency plugin, for instance.
- Другой способ — использовать файл каталога, чтобы переписать местоположение
a.xsd
в артефакт a
.
См., например, этот тестовый проект.
Проект a
совершенно не впечатляет. Просто компилирует схему a.xsd
.
Проект b
интереснее. Давайте взглянем.
pom.xml
а>:
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<configuration>
<catalog>src/main/resources/catalog.cat</catalog>
<episodes>
<episode>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin-tests-MAVEN_JAXB2_PLUGIN-82-a</artifactId>
</episode>
</episodes>
</configuration>
</plugin>
Конфигурация говорит использовать артефакт a
как эпизод. Поэтому, когда JAXB/XJC встречает классы, скомпилированные в a
, он будет повторно использовать их вместо создания новых.
Кстати, вместо настройки отдельных эпизоды. В этом случае все зависимости будут рассматриваться как эпизоды, что очень удобно (меньше конфигурации).
В конфигурации также указано использовать файл каталога:
REWRITE_SYSTEM "http://www.ab.org" "maven:org.jvnet.jaxb2.maven2:maven-jaxb2-plugin-tests-MAVEN_JAXB2_PLUGIN-82-a:jar::!"
Это указывает JAXB/XJC переписать все URL-адреса схемы, начинающиеся с http://www.ab.org
, чтобы вместо этого начинаться с maven:org.jvnet.jaxb2.maven2:maven-jaxb2-plugin-tests-MAVEN_JAXB2_PLUGIN-82-a:jar::!
. Последний будет обработан maven-jaxb2-plugin
и, наконец, преобразован в ресурс в a
.
Давайте посмотрим поближе. Схема b.xsd
импортирует http://www.ab.org/a.xsd
:
<import namespace="urn:a" schemaLocation="http://www.ab.org/a.xsd"/>
Это будет переписано в maven:org.jvnet.jaxb2.maven2:maven-jaxb2-plugin-tests-MAVEN_JAXB2_PLUGIN-82-a:jar::!/a.xsd
, которое будет преобразовано в a.xsd
внутри JAR проекта a
. Итак, наконец, JAXB/XJC сможет прочитать эту схему из артефакта JAR a
.
Вы также можете использовать PUBLIC
вместо REWRITE_SYSTEM
для ссылки на a.xsd
для каждого URI пространства имен вместо местоположения схемы (что логически лучше):
PUBLIC "urn:a" "maven:org.jvnet.jaxb2.maven2:maven-jaxb2-plugin-tests-MAVEN_JAXB2_PLUGIN-82-a:jar::!/a.xsd"
Однако есть ошибка в JAXB/XJC, это не работает, если у вас есть schemaLocation
в вашем xs:import
.
Это будет работать на данный момент:
<xsd:import namespace="urn:a"/>
Это не будет работать в данный момент:
<xsd:import namespace="urn:a" schemaLocation="a.xsd"/>
Я отправил Oracle запрос на вытягивание, который исправляет это, но он еще не применен.
Объяснение выше относится к maven-jaxb2-plugin
и работает в версиях 0.10.0 и выше.
Ваш исходный вопрос касается jaxb2-maven-plugin
от Codehaus, который является другим плагином Maven. Этот плагин не имеет всех функций, которые я описал выше, но по крайней мере эпизоды должны работать через аргументы. Каталоги также должны работать, но я считаю, что jaxb2-maven-plugin
работает не поддерживает разрешающие схемы в артефактах Maven. Вместо этого вы можете использовать maven-dependency-plugin
для извлечения a.xsd
из артефакта a
.
Отказ от ответственности SO: я являюсь автором файла maven-jaxb2-plugin
.
Примечание для рецензентов: я НЕ намерен продвигать/рекламировать свой плагин, я просто хочу предоставить решение заданного вопроса. И похоже, что мой проект предлагает лучшее/самое элегантное и полное решение.
person
lexicore
schedule
10.10.2014