我写了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.java
(com.nuovo.institute.model
和com.nuovo.employee.model
)。不仅在Institute.xsd中,我必须在Employee
中仅使用type
作为xsd
,而在某些XSDs
中我必须仅使用Furniture
作为type
Employee.java
如何确保这些类在其他包中不重复,以及如何使这些生成的类(Furniture.java
,Office.java
和toto
)与其他类相同
答案 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的版本,它们已经很老了。