Как создать общие XSD сгенерированные Java-классы
Я хочу генерировать java
занятия через XSDs
Я хочу использовать / включить один XSD
файл в другом, но когда я включаю их в другом XSDs
так же java
класс генерируется в обоих пакетах. Я также использую maven-jaxb2-plugin
плагин
1 ответ
Выполните отдельную компиляцию - модульную - схему, используя так называемые эпизоды. То есть, если вы хотите импортировать схему A в схему B и сгенерировать классы для схемы B, вы сначала создаете отдельный проект Maven, чтобы скомпилировать схему A в отдельный артефакт Maven с помощью maven-jaxb2-plugin, как обычно. (Это предполагает, что схема A стоит отдельно, то есть не импортирует никакую другую схему; в противном случае вам придется повторить тот же процесс на импортированных схемах.) В результате вы получите A.jar с сгенерированными классами только из схема A и, самое главное, файл META-INF/sun-jaxb.episode. Этот файл предоставляет информацию о существующих привязках XSD-Java, и это сообщит плагину maven-jaxb2 (фактически инструмент xjc, лежащий в основе плагина maven-jaxb2-plugin), что уже было сгенерировано из схемы, и, следовательно, предотвратит его. повторно сгенерировать те же классы снова.
Затем вы создаете еще один проект Maven, чтобы скомпилировать схему B с артефактом maven A.jar среди его зависимостей Maven. На этот раз в конфигурации maven-jaxb2-plugin вы устанавливаете параметр конфигурации useDependenciesAsEpisodes
в true
, Это скажет плагину использовать .episode
файлы из всех зависимостей (когда есть). Вы можете найти базовый пример на вики- сайте плагина GitHub. Ниже приведен реальный пример из проекта AuthzForce, реализации XACML, где стандартная схема OASIS XACML (xacml-core-v3-schema-wd-17.xsd
) импортирует стандартную схему пространства имен XML W3C (xml.xsd
). Следовательно, у вас есть один проект / артефакт Maven для xml.xsd и еще один для схемы XACML, где соответствующие части POM выглядят так:
<project ...>
...
<dependencies>
...
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>${artifactId.prefix}-xmlns-model</artifactId>
<version>${project.parent.version}</version>
</dependency>
...
</dependencies>
<build>
<plugins>
...
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<configuration>
<verbose>true</verbose>
<extension>true</extension>
<strict>false</strict>
<useDependenciesAsEpisodes>true</useDependenciesAsEpisodes>
...
<catalog>src/main/jaxb/catalog.xml</catalog>
<schemaDirectory>src/main/resources</schemaDirectory>
<schemaIncludes>
<include>xacml-core-v3-schema-wd-17.xsd</include>
</schemaIncludes>
</configuration>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Вы заметили, что есть также параметр каталога, указывающий на файл каталога XML. Это также важно, потому что этот каталог позволит плагину найти файл A.xsd (xml.xsd в моем примере) непосредственно в его артефакте maven, так что вам не нужно дублировать файл в проекте B или где-либо еще. В моем примере, поскольку схема XACML импортирует xml.xsd следующим образом:
<xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/>
... catalog.xml
должен выглядеть так:
<?xml version="1.0" encoding="UTF-8"?>
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
<system systemId="http://www.w3.org/2001/xml.xsd" uri="maven:org.ow2.authzforce:authzforce-ce-xmlns-model:jar!/xml.xsd" />
</catalog>
Вы замечаете, что uri
параметр ссылается на xml.xsd
из своего артефакта Maven. Дополнительную информацию об этом синтаксисе для ссылки на ресурсы артефактов Maven см. В вики maven-jaxb2-plugin.
В целом, чтобы обеспечить максимальную гибкость и простоту в управлении расположениями схемы, я рекомендую указывать только пространство имен в импорте схемы. (Нет schemaLocation
.) Например, предпочитаю это:
<xs:import namespace="http://www.w3.org/XML/1998/namespace" />
... в этом случае catalog.xml должен выглядеть так:
<?xml version="1.0" encoding="UTF-8"?>
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
<public publicId="http://www.w3.org/XML/1998/namespace" uri="maven:org.ow2.authzforce:authzforce-ce-xmlns-model:jar!/xml.xsd" />
</catalog>
(Это не так в моем примере исключительно, потому что официальная схема XACML от стандартного комитета использует schemaLocation
, поэтому желательно сохранить его как оригинал.)