用来记录一些原创性的总结
schemegen是JDK自带的一个工具,用来基于java或class文件生成对应的schema文件。对应的类可以通过JAXB注解来定义XML映射关系。我们先来看一个简单的示例,假设有如下这些java类需要用来生成schema文件。
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "root")
public class RootObject {
private String prop1;
private String prop2;
@XmlElementRef
private SuperClass superClass;
//省略get/set
}
public class SuperClass {
private String superProp1;
private String superProp2;
//省略get/set
}
@XmlRootElement(name="sub1")
public class SubClass1 extends SuperClass {
private String subProp1;
private String subProp2;
//省略get/set
}
@XmlRootElement(name="sub2")
public class SubClass2 extends SuperClass {
private String subProp1;
private String subProp2;
//省略get/set
}
这些类都是放在com.elim.jaxb包下面的,所以在命令行窗口定位到源文件根路径,运行命令即可在当前目录生成一个schema1.xsd文件。因为我们在源文件里面没有指定schema,所以它们都将使用相同的默认schema,这时候生成的schema文件只有一个。如果我们在源文件中指定了多个不同的schema时,生成出来的也将有多个schema文件。
schemagen com/elim/jaxb/*.java
生成出来的schema文件内容如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root" type="rootObject"/>
<xs:element name="sub1" type="subClass1"/>
<xs:element name="sub2" type="subClass2"/>
<xs:complexType name="rootObject">
<xs:sequence>
<xs:element name="prop1" type="xs:string" minOccurs="0"/>
<xs:element name="prop2" type="xs:string" minOccurs="0"/>
<xs:choice>
<xs:element ref="sub1"/>
<xs:element ref="sub2"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
<xs:complexType name="superClass">
<xs:sequence>
<xs:element name="superProp1" type="xs:string" minOccurs="0"/>
<xs:element name="superProp2" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="subClass1">
<xs:complexContent>
<xs:extension base="superClass">
<xs:sequence>
<xs:element name="subProp1" type="xs:string" minOccurs="0"/>
<xs:element name="subProp2" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="subClass2">
<xs:complexContent>
<xs:extension base="superClass">
<xs:sequence>
<xs:element name="subProp1" type="xs:string" minOccurs="0"/>
<xs:element name="subProp2" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
上面的示例也可以单独指定需要生成schema的java类:
schemagen com/elim/jaxb/RootObject.java com/elim/jaxb/SuperClass.java com/elim/jaxb/SubClass1.java com/elim/jaxb/SubClass2.java
除了基于Java源文件生成schema外,也可以基于编译好的class文件生成schema文件,只需要把后面的java文件替换为class即可,但对于class文件我们只需要确保它们在classpath下,并且指定对应的class名称即可,所以对于上述的示例,如果改为使用class文件生成schema,我们只需要定位到class文件根目录,运行如下指令即可。不需要单独指定SuperClass,因为它已经可以被RootObject关联到了。
schemagen com.elim.jaxb.RootObject com.elim.jaxb.SubClass1 com.elim.jaxb.SubClass2
不管是基于java文件还是基于class文件生成schema,都需要确保它们中应用的class都是在类路径下的。
以上只是一个简单的示例,接下来我们来看以下schemagen的语法,其语法如下:
schemagen [options] javafiles
其中的options支持以下选项,为保持原文语义,直接摘自官方文档: