Java 如何从JAR中获取文件引用

Java 如何从JAR中获取文件引用,java,jar,Java,Jar,首先,我想补充一点,我可能已经尝试了关于这个问题的每一个提议的解决方案,但仍然无法让它工作 这就是我的问题 我有一个解析XML文件的应用程序。我选择一个xml文件(源代码),并根据xsd对其进行验证(这是我无法访问的JAR中的文件)。在我的IDE中运行代码可以正常工作: xsd = new File(getClass().getResourceAsStream("xsds/2014/schema.xsd").getFile()); System.out.println(xsd.getAbsolu

首先,我想补充一点,我可能已经尝试了关于这个问题的每一个提议的解决方案,但仍然无法让它工作

这就是我的问题

我有一个解析XML文件的应用程序。我选择一个xml文件(源代码),并根据xsd对其进行验证(这是我无法访问的JAR中的文件)。在我的IDE中运行代码可以正常工作:

xsd = new File(getClass().getResourceAsStream("xsds/2014/schema.xsd").getFile());
System.out.println(xsd.getAbsolutePath());
//returns: C:\Users\xxx\Desktop\Documents\NetBeansProjects\JavaXMLValidator\build\classes\app\xsds\2014\schema.xsd
但当我通过应用程序构建JAR文件并运行它时,我无法获得该文件的引用。 当我从我的JAR中运行应用程序时,我得到以下结果:

//returns: C:\Users\xxx\Desktop\Documents\NetBeansProjects\JavaXMLValidator\dist\file:C:\Users\xxx\Desktop\Documents\NetBeansProjects\JavaXMLValidator\dist\JavaXMLValidator.jar!\app\xsds\2014\schema.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:\Users\xxx\Desktop\Documents\NetBeansProjects\JavaXMLValidator\dist\file:C:\Users\xxx\Desktop\Documents\NetBeansProjects\JavaXMLValidator\dist\JavaXMLValidator.jar!\app\xsds\2014\schema.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>
........
SAXParseException:架构\引用。4:无法读取架构文档
'C:\Users\xxx\Desktop\Documents\NetBeansProjects\JavaXMLValidator\dist\file:C:\Users\xxx\Desktop\Documents\NetBeansProjects\JavaXMLValidator\dist\JavaXMLValidator.jar\app\xsds\2014\schema.xsd',
因为1)找不到文档;
2) 文件无法读取;
3) 文档的根元素不是
........
有没有人能建议一种方法,让我在JAR中正确引用xsd文件


非常感谢您的帮助

正如程序员所说,使用
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;
}

正如程序员所说,使用
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;
}

正如程序员所说,使用
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;
}

正如程序员所说,使用
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");
    }
}

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

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");
    }
}

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

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");
    }
}

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

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");
    }
}

简而言之,你不能也不应该。如果“确实”需要
文件
引用,请使用
URL
InputStream
将资源提取到磁盘。请记住,一旦添加到Jar文件中,“文件”就嵌入到一个zip容器中,并且不能再被引用为
文件,如果它位于磁盘上,那么
将被引用。简而言之,答案是,您不能也不应该被引用。如果“确实”需要
文件
引用,请使用
URL
InputStream
将资源提取到磁盘。请记住,一旦添加到Jar文件中,“文件”就嵌入到一个zip容器中,并且不能再被引用为
文件,如果它位于磁盘上,那么
将被引用。简而言之,答案是,您不能也不应该被引用。如果“确实”需要
文件
引用,请使用
URL
InputStream
将资源提取到磁盘。请记住,一旦添加到Jar文件中,“文件”就嵌入到一个zip容器中,并且不能再被引用为
文件,如果它位于磁盘上,那么
将被引用。简而言之,答案是,您不能也不应该被引用。如果“确实”需要
文件
引用,请使用
URL
InputStream
将资源提取到磁盘。请记住,一旦添加到Jar文件中,“文件”就嵌入到zip容器中,如果它位于磁盘上,就不能再被引用为
文件