Как создать общие 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, поэтому желательно сохранить его как оригинал.)

Другие вопросы по тегам