Как создать общий сгенерированный класс xsd среди всех пакетов

Я написал Office.xsd

<?xml version="1.0" encoding="windows-1252" ?>

<xsd:element name="name" type="xsd:string" />

<xsd:complexType name="Employee">
    <xsd:sequence>
        <xsd:element name="entry_time" type="xsd:decimal"
            minOccurs="0" />
        <xsd:element name="exit_time" type="xsd:decimal"
            minOccurs="0" />
    </xsd:sequence>
</xsd:complexType>

 <xsd:complexType name="Furniture">
    <xsd:sequence>
        <xsd:element name="name" type="xsd:string"
            minOccurs="0" />
        <xsd:element name="quantity" type="xsd:int"
            minOccurs="0" />
    </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="Office">
    <xsd:sequence>
        <xsd:element name="name" type="xsd:string" minOccurs="0" />
        <xsd:element name="address" type="xsd:string" minOccurs="0" />
        <xsd:element name="employee" type="Employee"
            minOccurs="0" />
        <xsd:element name="furniture" type="Furniture"
            minOccurs="0" />
    </xsd:sequence>
</xsd:complexType>

Я создаю еще один Institute.xsd, в который я включил Office.xsd, как показано ниже.

<xsd:include schemaLocation="Office.xsd" />

<xsd:complexType name="Institute">
    <xsd:sequence>
        <xsd:element name="id" type="xsd:in" minOccurs="1" />
        <xsd:element name="name" type="xsd:string" minOccurs="1" />
        <xsd:element name="employee" type="Employee"
            minOccurs="0" />
        <xsd:element name="furniture" type="Furniture"
            minOccurs="0" />
    </xsd:sequence>
</xsd:complexType>

I am using maven-jaxb2-plugin plug-in .. here is my plug-in

<plugin>
            <groupId>org.jvnet.jaxb2.maven2</groupId>
            <artifactId>maven-jaxb2-plugin</artifactId>
            <version>0.8.3</version>
            <executions>
                <execution>
                    <id>emp</id>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                    <configuration>
                        <forceRegenerate>true</forceRegenerate>
                        <schemaDirectory>src/main/resources/xsd</schemaDirectory>
                        <schemaIncludes>
                            <include>Office.xsd</include>
                        </schemaIncludes>
                        <generatePackage>com.nuovo.employee.model</generatePackage>
                    </configuration>
                </execution>
                <execution>
                    <id>inst</id>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                    <configuration>
                        <forceRegenerate>true</forceRegenerate>
                        <schemaDirectory>src/main/resources/xsd</schemaDirectory>
                        <schemaIncludes>
                            <include>Institute.xsd</include>
                        </schemaIncludes>
                        <generatePackage>com.nuovo.institute.model</generatePackage>
                        <args>
                            <arg>-XtoString</arg>
                            <arg>-Xcopyable</arg>
                            <arg>-Xequals</arg>
                        </args>
                        <plugins>
                            <plugin>
                                <groupId>org.jvnet.jaxb2_commons</groupId>
                                <artifactId>jaxb2-basics</artifactId>
                                <version>0.6.4</version>
                            </plugin>
                        </plugins>
                    </configuration>
                </execution>
            <dependencies>
                <dependency>
                    <groupId>com.datastax.cassandra</groupId>
                    <artifactId>cassandra-driver-core</artifactId>
                    <version>3.1.3</version>
                </dependency>
                <dependency>
                    <groupId>com.datastax.cassandra</groupId>
                    <artifactId>cassandra-driver-mapping</artifactId>
                    <version>3.1.3</version>
                </dependency>
            </dependencies>
        </plugin>

Я получаю Employee.java, Furniture.Java and Office.java в обоих пакетах (com.nuovo.institute.model и com.nuovo.employee.model). Не только в Institute.xsd, я должен использовать только Employee как type в другом xsd, так и в некоторых XSDs я должен использовать только Furniture как type как мне убедиться, что эти классы не дублируются в других пакетах и ​​как сделать эти сгенерированные классы( Employee.java, Furniture.java и Office.java) как общие для других классов


person Sat    schedule 22.02.2018    source источник


Ответы (1)


Чтобы избежать дублирования классов с maven-jaxb2-plugin, вы должны использовать модульная — также известная как эпизодная — компиляция схемы, т. е. с использованием эпизодов и XML-каталога(ов) ссылка на файлы XSD из ресурсов артефактов Maven. Однако это известная проблема, что это не работает со схемой include, но только со схемой import. Поэтому либо вы меняете include на import в Institude.xsd, либо используете один из двух вариантов, упомянутых в известной проблемы:

  • Запишите файл META-INF/sub-jaxb.episode вручную.
  • Напишите свой собственный подключаемый модуль XJC для создания этого файла без map="false". Это несложно, см. com.sun.tools.xjc.addon.episode.PluginImpl.

Также убедитесь, что вы обновили свои версии maven-jaxb2-plugin и jaxb2-basics, они довольно старые.

person cdan    schedule 24.02.2018