如何从JAR中获取File引用

  • 本文关键字:获取 File 引用 JAR java jar
  • 更新时间 :
  • 英文 :


首先我想补充的是,我可能已经尝试了关于这个问题的每一个建议的解决方案,但仍然不能使它工作。

这就是我的问题……

我有一个解析XML文件的应用程序。我选择一个xml文件(源文件),并根据xsd(这是JAR中我无法访问的文件)验证它。在我的IDE中运行代码可以正常工作:
xsd = new File(getClass().getResourceAsStream("xsds/2014/schema.xsd").getFile());
System.out.println(xsd.getAbsolutePath());
//returns: C:UsersxxxDesktopDocumentsNetBeansProjectsJavaXMLValidatorbuildclassesappxsds2014schema.xsd

但是当我通过应用程序构建JAR文件并运行它时,我无法获得对该文件的引用。当我从我的JAR中运行应用程序时,我得到这个:

//returns: C:UsersxxxDesktopDocumentsNetBeansProjectsJavaXMLValidatordistfile:C:UsersxxxDesktopDocumentsNetBeansProjectsJavaXMLValidatordistJavaXMLValidator.jar!appxsds2014schema.xsd  

路径看起来不错(我认为),但我不能在代码中得到对我的文件的正确引用:

Source schemaFile = new StreamSource(xsd);
Schema schema = null;
try {
    schema = factory.newSchema(schemaFile);
} catch (SAXException ex) {
    JOptionPane.showMessageDialog(null, "Invalid XML Schema Selected!!!n Exception: "+this.getStackTraceString(ex,"    "));
    return;
}

我得到了异常:

SAXParseException: schema_reference.4: Failed to read schema document 
'C:UsersxxxDesktopDocumentsNetBeansProjectsJavaXMLValidatordistfile:C:UsersxxxDesktopDocumentsNetBeansProjectsJavaXMLValidatordistJavaXMLValidator.jar!appxsds2014schema.xsd',
because 1)could not find the document;
2)the document could not be read;
3)the root element of the document is not <xsd:schema>
........
谁能建议一种方法,我可以有一个正确的引用JAR中的xsd文件?

非常感谢您的帮助

正如MadProgrammer所说,使用URL:

URL xsd = getClass().getResource("xsds/2014/schema.xsd");
Schema schema = null;
try {
    schema = factory.newSchema(xsd);
} catch (SAXException ex) {
    JOptionPane.showMessageDialog(null, "Invalid XML Schema Selected!!!n Exception: "+this.getStackTraceString(ex,"    "));
    return;
}

例如,有一个项目具有这样的结构:

testproject
  xsdfolder
    schema.xsd
  javaclassfolder
    SomeClass.java
public static class SomeClass {
    public static URL getLocalXsd() throws MalformedURLException {
      URL baseUrl = SomeClass.class.getResource(SomeClass.class.getSimpleName() + ".class");
      return new URL(baseUrl, "../xsdfolder/schema.xsd");
    }
}

最新更新