使用资源在 JAR 中加载 XSD 架构失败

问题描述 投票:0回答:2

在我的 jar 中,我提供了我的 xsd 架构文件,即以下结构:

myjar
 - myschema.xsd

当我解压缩该文件时,我可以验证该文件是否存在于 JAR 内的根级别。

我通过以下方式将 xsd 架构添加到 SchemaFactory:

public void loadXSDSchema() throws InitializationException {
    SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    try {
        xsdSchema = sf.newSchema(new File(getClass().getClassLoader().getResource(XSD_SCHEMA_FILE).getFile()));
    } catch (SAXException e) {
        throw new InitializationException(ApiExceptionId.INIT_XSD_SCHEMA, e);
    }

不幸的是,它在生成的 JAR 文件中不起作用 - 我收到 FileNotFoundException:

Caused by: java.io.FileNotFoundException: D:\dev\myjar.jar!\myschema.xsd (Die Syntax f▒r den Dateinamen, Verzeichnisnamen oder die Datentr▒gerbezeichnung ist falsch)

我以为我确实知道当它打包在罐子里时你需要将它作为资源来读取,但现实告诉我我似乎做错了一些事情。

关于我缺少什么的任何提示?

java jar xsd
2个回答
6
投票

您无法将其作为文件获取,因为它不是文件。它是您的 jar 文件中的一个条目。文件是操作系统对象,从操作系统的角度来看,jar 文件就是文件。虽然你可以通过

InputStream
得到一个
ClassLoader
并且你可以通过这个 InputStream 读取它的内容。

Schema xsdSchema = sf.newSchema( new StreamSource(ClassLoader.getSystemResourceAsStream("shema.xsd")));

0
投票

对于SpringBoot用户,如果将资源文件打包成可执行jar,则无法通过文件系统url加载这些文件。相反,您需要使用

ClassPathResource
来获取输入流。

SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
ClassPathResource resource = new ClassPathResource(YOUR_RESOURCE_PATH);
try (InputStream inputStream = resource.getInputStream()) {
    return sf.newSchema(new StreamSource(inputStream)); 
}
© www.soinside.com 2019 - 2024. All rights reserved.