如何从 JAR 中获取文件引用
How to get a File reference from within a JAR
首先,我想补充一点,关于这个问题,我可能已经尝试了所有建议的解决方案,但仍然无法正常工作。
所以这是我的问题...
我有一个用于解析 XML 文件的应用程序。我 select 一个 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\xsds14\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\xsds14\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\xsds14\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>
........
任何人都可以建议我可以使用 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");
}
}
首先,我想补充一点,关于这个问题,我可能已经尝试了所有建议的解决方案,但仍然无法正常工作。
所以这是我的问题...
我有一个用于解析 XML 文件的应用程序。我 select 一个 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\xsds14\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\xsds14\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\xsds14\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>
........
任何人都可以建议我可以使用 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");
}
}