我应该在哪里放置一个 XSD 文件以用于 JAXB 代码生成和 XML 验证
Where should I place an XSD file to use for JAXB code gen and for XML validation
我在我的 Java 项目中创建了一个 XSD 文件,它定义了一个用户可编辑的输入文件(为了说明,假设 XSD 被称为 userinput.xsd并且用户可编辑的文件是 userinput.xml)。当程序 运行s 时,它使用 JAXB 来验证用户在 XML 文件中没有犯任何错误,因为它将文件解组为 DOM.
我使用 Maven Standard Directory Layout 构建了我的项目,并使用 xjc 生成了 JAXB 对象工厂和其他 类,将它们放在名为 /src/main/java/my/name/space/generated/userinput 的目录中(以匹配XSD).
我已将 XSD 文件放入 /src/main/resources。
当我打包我的 jar 文件时,该文件位于 jar 的根目录中,我可以在 Java 代码中引用它,如下所示(特别注意第 4 行中提到的资源):
JAXBContext jaxbContext = JAXBContext.newInstance("my.name.space.generated.userinput");
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(getClass().getResource("/userinput.xsd"));
unmarshaller.setSchema(schema);
JAXBElement<?> userinputType = (JAXBElement<?>) unmarshaller.unmarshal(new FileInputStream("userinput.xml"));
这行得通,但它似乎不正确,因为这意味着如果我想扩展到多个输入文件,我最终可能会在源代码管理的资源目录和jar 文件的根目录。
此外,当我 运行 来自我的 IDE 而不是来自打包的 jar 的程序时,我必须将第四条语句更改为:
Schema schema = schemaFactory.newSchema(getClass().getResource("src/main/resources/userinput.xsd"));
我应该将 XSD 文件 (a) 放在我的源代码管理(即 Maven 结构)和 (b) 我的 jar 文件中的什么位置? [注意:运行 xjc 通过我的 IDE 将它放在 .../generated/userinput 目录中,但 Maven 在打包时忽略它。]
我正在寻找一个表明存在某种通用方法的答案,因此如果可能的话希望得到参考。如果这是目前留给开发人员的未指定选择,那么请这样说(最好是引用),因为我知道 Whosebug 不是收集意见的地方。
maven-jaxb2-plugin 的默认布局是将模式放在 src/main/resources
中。然后,您的架构 schema.xsd
可用作 getClass().getResource("/schema.xsd")
.
的资源
有些人使用 src/main/schemas
或 src/main/xsd
。但是如果你想使用模式作为资源,最好使用默认值。
我不明白为什么会这样 "does not seem right"。究竟是什么问题?版本控制中有很多文件? JAR 中有很多文件?为什么这是个问题?
如果您想构建和模块化,请在自己的 Maven 模块中单独编译您的模式。我通常更喜欢每个 specification/version 一个模块(例如,参见 ogc-schemas 项目。
如果您需要在IDE中执行getClass().getResource("src/main/resources/userinput.xsd")
,这表明您在IDE中的项目配置有误。资源应该是 copied/seen 作为类路径的一部分,所以只有 /userinput.xsd
应该可以工作。这并不意味着src/main/resources
是一个错误的地方,它意味着你的项目没有正确配置。
如果您使用的是 Maven,请不要依赖 IDE 来生成代码。代码生成是构建过程的一部分。使用 Maven 插件进行模式编译。
免责声明:我是 maven-jaxb2-plugin 以及上述 OGC Schemas 项目的作者。
我在我的 Java 项目中创建了一个 XSD 文件,它定义了一个用户可编辑的输入文件(为了说明,假设 XSD 被称为 userinput.xsd并且用户可编辑的文件是 userinput.xml)。当程序 运行s 时,它使用 JAXB 来验证用户在 XML 文件中没有犯任何错误,因为它将文件解组为 DOM.
我使用 Maven Standard Directory Layout 构建了我的项目,并使用 xjc 生成了 JAXB 对象工厂和其他 类,将它们放在名为 /src/main/java/my/name/space/generated/userinput 的目录中(以匹配XSD).
我已将 XSD 文件放入 /src/main/resources。
当我打包我的 jar 文件时,该文件位于 jar 的根目录中,我可以在 Java 代码中引用它,如下所示(特别注意第 4 行中提到的资源):
JAXBContext jaxbContext = JAXBContext.newInstance("my.name.space.generated.userinput");
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(getClass().getResource("/userinput.xsd"));
unmarshaller.setSchema(schema);
JAXBElement<?> userinputType = (JAXBElement<?>) unmarshaller.unmarshal(new FileInputStream("userinput.xml"));
这行得通,但它似乎不正确,因为这意味着如果我想扩展到多个输入文件,我最终可能会在源代码管理的资源目录和jar 文件的根目录。
此外,当我 运行 来自我的 IDE 而不是来自打包的 jar 的程序时,我必须将第四条语句更改为:
Schema schema = schemaFactory.newSchema(getClass().getResource("src/main/resources/userinput.xsd"));
我应该将 XSD 文件 (a) 放在我的源代码管理(即 Maven 结构)和 (b) 我的 jar 文件中的什么位置? [注意:运行 xjc 通过我的 IDE 将它放在 .../generated/userinput 目录中,但 Maven 在打包时忽略它。]
我正在寻找一个表明存在某种通用方法的答案,因此如果可能的话希望得到参考。如果这是目前留给开发人员的未指定选择,那么请这样说(最好是引用),因为我知道 Whosebug 不是收集意见的地方。
maven-jaxb2-plugin 的默认布局是将模式放在 src/main/resources
中。然后,您的架构 schema.xsd
可用作 getClass().getResource("/schema.xsd")
.
的资源
有些人使用 src/main/schemas
或 src/main/xsd
。但是如果你想使用模式作为资源,最好使用默认值。
我不明白为什么会这样 "does not seem right"。究竟是什么问题?版本控制中有很多文件? JAR 中有很多文件?为什么这是个问题?
如果您想构建和模块化,请在自己的 Maven 模块中单独编译您的模式。我通常更喜欢每个 specification/version 一个模块(例如,参见 ogc-schemas 项目。
如果您需要在IDE中执行getClass().getResource("src/main/resources/userinput.xsd")
,这表明您在IDE中的项目配置有误。资源应该是 copied/seen 作为类路径的一部分,所以只有 /userinput.xsd
应该可以工作。这并不意味着src/main/resources
是一个错误的地方,它意味着你的项目没有正确配置。
如果您使用的是 Maven,请不要依赖 IDE 来生成代码。代码生成是构建过程的一部分。使用 Maven 插件进行模式编译。
免责声明:我是 maven-jaxb2-plugin 以及上述 OGC Schemas 项目的作者。