我在我的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不是收集意见的地方。
答案 0 :(得分:2)
maven-jaxb2-plugin的默认布局是将模式放在src/main/resources
中。然后,您的架构schema.xsd
可用作getClass().getResource("/schema.xsd")
的资源
有些人使用src/main/schemas
或src/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插件进行模式编译。
免责声明:我是maven-jaxb2-plugin的作者,也是上述OGC Schemas项目的作者。