我在我的 Java 项目中创建了一个 XSD 文件,它定义了一个用户可编辑的输入文件(为了说明,假设 XSD 称为 userinput.xsd,而用户可编辑的文件是 userinput.xml)。当程序运行时,它使用 JAXB 来验证用户在将文件解码为 DOM 时没有在 XML 文件中犯任何错误。
我使用 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 文件的根目录中得到许多 .xsd 文件.
此外,当我从我的 IDE 而不是从打包的 jar 运行程序时,我必须将第四条语句更改为:
Schema schema = schemaFactory.newSchema(getClass().getResource("src/main/resources/userinput.xsd"));
我应该将 XSD 文件 (a) 放在我的源代码控制(即 Maven 结构)和 (b) 我的 jar 文件的什么位置? [注意:通过我的 IDE 运行 xjc 会将它放在 .../generated/userinput 目录中,但 Maven 在打包时会忽略它。]
我正在寻找一个表明存在某种通用方法的答案,因此如果可能的话,我希望得到一个引用。如果这是目前留给开发人员的一个未指定的选择,那么请这样说(最好是引用),因为我知道 stackoverflow 不是收集意见的地方。
最佳答案
maven-jaxb2-plugin 的默认布局就是将模式放在src/main/resources
中。然后,您的架构 schema.xsd
可用作 getClass().getResource("/schema.xsd")
的资源。
有些人使用 src/main/schemas
或 src/main/xsd
。但是如果你想使用模式作为资源,最好使用默认值。
我不明白为什么这“看起来不对”。究竟是什么问题?版本控制中有很多文件? JAR 中有很多文件?为什么这是个问题?
如果您想构建和模块化,请在自己的 Maven 模块中单独编译您的模式。我通常更喜欢每个规范/版本一个模块(例如,参见 ogc-schemas 项目。
如果您需要在IDE中执行getClass().getResource("src/main/resources/userinput.xsd")
,这表明您在IDE中的项目配置有误.资源应该被复制/视为类路径的一部分,所以只有 /userinput.xsd
应该可以工作。这并不意味着 src/main/resources
是错误的地方,这意味着您的项目没有正确配置。
如果您使用 Maven,请不要依赖 IDE 来生成代码。代码生成是构建过程的一部分。使用 Maven 插件进行架构编译。
免责声明:我是 maven-jaxb2-plugin 的作者以及上面提到的 OGC Schemas 项目。
关于java - 我应该在哪里放置 XSD 文件以用于 JAXB 代码生成和 XML 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30983219/