schemagen.exe 命令是 Java Development Kit (JDK) 提供的一个命令行工具,主要用于从 Java 类生成 XML 模式(XML Schema)文件。
该命令通过解析 Java 类的 JAXB 注解来生成对应的 XML 模式,这些模式描述了如何将 Java 对象映射到 XML 文档,以及如何将 XML 文档转换回 Java 对象。
JAXB 是一个允许 Java 开发人员将 Java 对象映射为 XML 表示的框架。它提供了将 Java 类映射到 XML 模式,以及将 XML 实例文档反向生成 Java 对象树的方法。
JAXB 支持两种主要的操作:
(1)将 Java 对象编组(marshal)为 XML
(2)将 XML 解组(unmarshal)为 Java 对象
JAXB 2.0 是 JDK 1.6 的组成部分。
JAXB 2.2.3 是 JDK 1.7 的组成部分。注意,从 JDK 11 开始,JAXB 已被移出 JDK 标准库,需要作为独立的库进行引入。
重要类和接口:
JAXBContext:应用的入口,用于管理 XML/Java 绑定信息。
Marshaller 接口:将 Java 对象序列化为 XML 数据。
Unmarshaller 接口:将 XML 数据反序列化为 Java 对象。
JAXB 通过注解来指示如何将 Java 类映射到 XML 元素、属性和其他结构。常用的注解包括:
@XmlRootElement:将 Java 类或枚举类型映射到 XML 元素。
@XmlElement:将 Java 类的一个属性映射到与属性同名的一个 XML 元素。
@XmlAttribute:将 Java 类的一个属性映射到与属性同名的一个 XML 属性。
@XmlAccessorType:控制字段或属性的序列化。
@XmlAccessorOrder:控制 JAXB 绑定类中属性和字段的排序。
@XmlJavaTypeAdapter:使用定制的适配器以序列化 Java 类为 XML。
当你需要为 Java 类生成相应的 XML 模式(Schema)文件时,可以使用 schemagen.exe 命令。
这在数据交换、Web 服务(如 RESTful API)和消息传递等场景中非常有用,因为它允许你定义 Java 类和 XML 文档之间的映射关系。
schemagen [-options ...] <java files>
-d <path> 指定放置处理程序和 javac 生成的类文件的位置
-cp <path> 指定查找用户指定文件的位置
-classpath <path> 指定查找用户指定文件的位置
-encoding <encoding> 指定用于注释处理/javac 调用的编码
-episode <file> 生成片段文件以供单独编译
-version 显示版本信息
-fullversion 显示完整的版本信息
-help 显示此用法消息
(1)基本用法:直接指定要生成 Schema 的 Java 文件路径。假设在当前目录下有一个名为 SchemagenDemo.java 的文件,可执行以下命令:
D:\share_dir\ShareDoc> schemagen SchemagenDemo.java
SchemagenDemo.java 文件内容如下:
import javax.xml.bind.annotation.XmlRootElement; import java.util.List; /** * 用于 schemagen 命令的示例代码 * @author hxstrive.com */ public class SchemagenDemo { private List<Person> peoples; public List<Person> getPeoples() { return peoples; } public void setPeoples(List<Person> peoples) { this.peoples = peoples; } @XmlRootElement public static class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } }
命令执行成功后,将在当前目录输出名为 schema1.xsd 的文件,该文件内容如下:
<?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="person" type="person"/> <xs:complexType name="schemagenDemo"> <xs:sequence> <xs:element name="peoples" type="person" nillable="true" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> <xs:complexType name="person"> <xs:sequence> <xs:element name="age" type="xs:int"/> <xs:element name="name" type="xs:string" minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:schema>
(2)指定输出路径:使用 -d 选项指定生成的 XML Schema 文件的输出目录。例如,要将生成的文件输出到当前目录的 schemas 子目录下:
D:\share_dir\ShareDoc> schemagen -d schemas SchemagenDemo.java
执行上述命令后,如下图:
注意,如果当前目录下面没有 schemas 目录,则会出现“目录 "schemas" 不存在。”错误。
(3)处理引用了外部类的情况:如果要生成 Schema 的 Java 文件引用了外部类,需要使用 -cp(或 -classpath)选项指明寻找路径(注意路径中不包含包名)。假设有一个名为 MyComplexClass.java 的文件,它引用了外部类,外部类位于 D:\external_classes 目录下,则命令如下:
schemagen -d D:\schemas -cp D:\external_classes MyComplexClass.java
注意:使用 schemagen.exe 命令时,需要在命令行中进入到包含该工具的目录(通常是 JDK 的 bin 目录)。