创建一个由xsd生成的公共类,供其他包使用
我试图使用相同的生成类,但在不同的包中。所以结构应该是这样的:创建一个由xsd生成的公共类,供其他包使用,xsd,jaxb,xjc,maven-jaxb2-plugin,Xsd,Jaxb,Xjc,Maven Jaxb2 Plugin,我试图使用相同的生成类,但在不同的包中。所以结构应该是这样的: com.test.common -commonType.java com.test.A -objectA.java com.test.B -objectB.java <?xml version="1.0"?> <xs:schema elementFormDefault="qualified" version="1.0" targetNamespace="http://test
com.test.common
-commonType.java
com.test.A
-objectA.java
com.test.B
-objectB.java
<?xml version="1.0"?>
<xs:schema elementFormDefault="qualified" version="1.0"
targetNamespace="http://test.com/magic/common"
xmlns="http://test.com/magic/common"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="2.0">
<xs:complexType name="CommonType">
<xs:sequence>
<xs:element name="name" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:schema>
<jxb:bindings schemaLocation="../xsd/common.xsd" node="/xsd:schema">
<jxb:schemaBindings>
<jxb:package name="com.test.common"/>
</jxb:schemaBindings>
</jxb:bindings>
但我一直在想:
com.test.common
-commonType.java
com.test.A
-objectA.java
-commonType.java
com.test.B
-objectB.java
-commonType.java
我的common.xsd如下所示:
com.test.common
-commonType.java
com.test.A
-objectA.java
com.test.B
-objectB.java
<?xml version="1.0"?>
<xs:schema elementFormDefault="qualified" version="1.0"
targetNamespace="http://test.com/magic/common"
xmlns="http://test.com/magic/common"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="2.0">
<xs:complexType name="CommonType">
<xs:sequence>
<xs:element name="name" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:schema>
<jxb:bindings schemaLocation="../xsd/common.xsd" node="/xsd:schema">
<jxb:schemaBindings>
<jxb:package name="com.test.common"/>
</jxb:schemaBindings>
</jxb:bindings>
objectA.xsd看起来像
<?xml version="1.0"?>
<xs:schema elementFormDefault="qualified" version="1.0"
targetNamespace="http://test.com/magic/objectA"
xmlns:common="http://test.com/magic/common"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="2.0">
<xs:complexType name="ObjectA">
<xs:sequence>
<xs:element name="size" type="xs:string" />
<xs:element name="commonA" type="common:CommonType" />
</xs:sequence>
</xs:complexType>
</xs:schema>
objectB.xsd看起来像:
<?xml version="1.0"?>
<xs:schema elementFormDefault="qualified" version="1.0"
targetNamespace="http://test.com/magic/objectB"
xmlns:common="http://test.com/magic/common"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="2.0">
<xs:complexType name="ObjectB">
<xs:sequence>
<xs:element name="version" type="xs:string" />
<xs:element name="commonB" type="common:CommonType" />
</xs:sequence>
</xs:complexType>
</xs:schema>
我有一个公共绑定文件common.xjb,如下所示:
com.test.common
-commonType.java
com.test.A
-objectA.java
com.test.B
-objectB.java
<?xml version="1.0"?>
<xs:schema elementFormDefault="qualified" version="1.0"
targetNamespace="http://test.com/magic/common"
xmlns="http://test.com/magic/common"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="2.0">
<xs:complexType name="CommonType">
<xs:sequence>
<xs:element name="name" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:schema>
<jxb:bindings schemaLocation="../xsd/common.xsd" node="/xsd:schema">
<jxb:schemaBindings>
<jxb:package name="com.test.common"/>
</jxb:schemaBindings>
</jxb:bindings>
最后,我的专业工作是这样的:
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<configuration>
<args>
<arg>-Xequals</arg>
</args>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics</artifactId>
<version>0.6.3</version>
</plugin>
</plugins>
<episode>true</episode>
<extension>true</extension>
<verbose>true</verbose>
<generateDirectory>src/main/java</generateDirectory>
</configuration>
<executions>
<execution>
<id>common</id>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<generatePackage>com.test.common</generatePackage>
<schemaIncludes>
<includeSchema>xsd/common.xsd</includeSchema>
</schemaIncludes>
</configuration>
</execution>
<execution>
<id>login</id>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<generatePackage>com.test.A</generatePackage>
<bindingIncludes>
<includeBinding>xjb/commons.xjb</includeBinding>
</bindingIncludes>
<schemaIncludes>
<includeSchema>xsd/objectA.xsd</includeSchema>
</schemaIncludes>
</configuration>
</execution>
<execution>
<id>alert</id>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<generatePackage>com.test.B</generatePackage>
<bindingIncludes>
<includeBinding>xjb/commons.xjb</includeBinding>
</bindingIncludes>
<schemaIncludes>
<includeSchema>xsd/objectB.xsd</includeSchema>
</schemaIncludes>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
org.jvnet.jaxb2.maven2
maven-jaxb2-plugin
-Xequals
org.jvnet.jaxb2_commons
jaxb2基础知识
0.6.3
真的
真的
真的
src/main/java
常见的
生成
com.test.common
xsd/common.xsd
登录
生成
com.test.A
xjb/commons.xjb
xsd/objectA.xsd
警觉的
生成
com.test.B
xjb/commons.xjb
xsd/objectB.xsd
您可以使用JAXB XJC中的-eposion
扩展来处理此用例:
XJC调用common.xsd
xjc -d out -episode common.episode common.xsd
XJC调用objectA.xsd
xjc -d out -episode common.episode common.xsd
第一步生成的插曲文件实际上是一个JAXB外部绑定文件,其中包含模式类型和现有类之间的链接。这会阻止XJC重新生成这些类
xjc -d out objectA.xsd -extension -b common.episode
有关详细示例
maven-jaxb2-plugin
文档中有一部分专门针对。但是,您也可以使用普通的XJC绑定来实现您的目标
- 不要在插件配置中使用
,在绑定中使用generatePackage
,例如:jaxb:package
<jaxb:schemaBindings> <jaxb:package name="generatePackage"/> </jaxb:schemaBindings>
- 在
中的xjb/commons.xjb
上使用commonType
因此免责声明:我是
maven-jaxb2-plugin
的作者,我尝试过使用它,但我仍然导致两次生成CommonType,我必须添加必要的XML模式导入
,但一旦添加,我就能够使用命令行XJC,如我的回答中所述,仅从common.xsd生成类这是正确的,命令行按预期工作,但由于某些原因,maven插件即使在我指定时也无法工作configurations@SarvarNishonboev完成。