java - 我应该在哪里放置 XSD 文件以用于 JAXB 代码生成和 XML 验证

标签 java xml maven xsd jaxb

我在我的 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 不是收集意见的地方。

最佳答案

的默认布局就是将模式放在src/main/resources中。然后,您的架构 schema.xsd 可用作 getClass().getResource("/schema.xsd") 的资源。
有些人使用 src/main/schemassrc/main/xsd。但是如果你想使用模式作为资源,最好使用默认值。

我不明白为什么这“看起来不对”。究竟是什么问题?版本控制中有很多文件? JAR 中有很多文件?为什么这是个问题?

如果您想构建和模块化,请在自己的 Maven 模块中单独编译您的模式。我通常更喜欢每个规范/版本一个模块(例如,参见 ogc-schemas 项目。

如果您需要在IDE中执行getClass().getResource("src/main/resources/userinput.xsd"),这表明您在IDE中的项目配置有误.资源应该被复制/视为类路径的一部分,所以只有 /userinput.xsd 应该可以工作。这并不意味着 src/main/resources 是错误的地方,这意味着您的项目没有正确配置。

如果您使用 Maven,请不要依赖 IDE 来生成代码。代码生成是构建过程的一部分。使用 Maven 插件进行架构编译。

免责声明:我是 的作者以及上面提到的 OGC Schemas 项目。

关于java - 我应该在哪里放置 XSD 文件以用于 JAXB 代码生成和 XML 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30983219/

相关文章:

Javac 未与 openjdk-6-jdk 一起安装

java - HttpJUnitRunner 无法解析为类型

java - 尝试在maven的pom.xml中添加插件

eclipse - 禁用 Eclipse JSF 方面/性质

php - 使用带有特殊字符的 SimpleXML 在 PHP 中创建 XML

java - 如何执行spring-boot :run from terminal for Remote Debugging

java - 从 Livelink 导出数据

java - 如何在 JSF 页面中正确声明一个对象存在于具有给定类型的 session 对象中?

java - 有没有办法获取xml文件中的Bean ID

java - 如何实现 xml 可保存/可加载类?