如何在所有包中创建通用xsd生成的类

时间:2018-02-22 11:14:55

标签: java xml xsd maven-jaxb2-plugin

我写了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>

我正在使用maven-jaxb2-plugin插件..这是我的插件

<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.javacom.nuovo.institute.modelcom.nuovo.employee.model)。不仅在Institute.xsd中,我必须在Employee中仅使用type作为xsd,而在某些XSDs中我必须仅使用Furniture作为type Employee.java如何确保这些类在其他包中不重复,以及如何使这些生成的类(Furniture.javaOffice.javatoto)与其他类相同

1 个答案:

答案 0 :(得分:0)

为了避免使用maven-jaxb2-plugin重复的类,您必须使用modular - aka episodic - schema compilation,即使用剧集和XML目录referencing the XSD file(s) from Maven artifact resources。但是,它known issue不适用于架构include,而只适用于架构import。因此,您可以在include中将import更改为Institude.xsd,或使用known issue页面上提到的两个选项之一:

  
      
  • 手动编写META-INF / sub-jaxb.episode文件。
  •   
  • 编写您自己的XJC插件以生成此文件而不使用map =“false”。这并不难,请参阅com.sun.tools.xjc.addon.episode.PluginImpl。
  •   

另外请确保升级maven-jaxb2-plugin和jaxb2-basics的版本,它们已经很老了。