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

时间:2015-06-22 14:56:30

标签: java xml maven xsd jaxb

我在我的Java项目中创建了一个XSD文件,用于定义用户可编辑的输入文件(例如,假设XSD名为userinput.xsd,用户可编辑文件为userinput.xml)。当程序运行时,它使用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文件的根目录中有许多.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不是收集意见的地方。

1 个答案:

答案 0 :(得分:2)

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

我不明白为什么这个&#34;似乎不正确&#34;。究竟是什么问题?版本控制中的许多文件? JAR中的许多文件?为什么这是一个问题?

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

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

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

免责声明:我是的作者,也是上述OGC Schemas项目的作者。