Java 使用资源在JAR中加载XSD模式失败

Java 使用资源在JAR中加载XSD模式失败,java,jar,xsd,Java,Jar,Xsd,在我的jar中,我提供了我的xsd模式文件,即以下结构: myjar - myschema.xsd 解压文件时,我可以验证该文件是否存在于JAR内部的根级别 我以以下方式将xsd模式添加到SchemaFactory: public void loadXSDSchema() throws InitializationException { SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_N

在我的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)
我想我确实知道,当它被包装在一个罐子里时,你需要把它作为一种资源来阅读,但现实告诉我,我似乎做错了什么


有没有关于我缺少什么的提示?

您无法将其作为文件获取,因为它不是文件。它是jar文件中的一个条目。文件是操作系统对象,从操作系统的角度来看,jar文件就是文件。尽管您可以通过
ClassLoader
获取
InputStream
,并且可以通过该InputStream读取其内容

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

好吧,现在我明白了。我只知道关于资源的事情,但是是的,这很有道理,谢谢!在我的例子中,Hi需要从类路径加载一个XSD,而其他XSD也在类路径上。在这种情况下,您的代码无法正常工作,因为
sf
schema工厂无法定位导入的XSD。很抱歉,如果它不能解决您的问题,但它清楚地解决了原始问题,那么答案在这里是有效的。问你自己的问题可能会解决你的问题。不幸的是,我不知道如何处理嵌入式xsd引用。