我试图用一个文件对象,与当前的jar文件,这是运行的内部XML文件的路径,在builder.parse(不xml文件的绝对路径);
的DocumentBuilder助洗剂= dbf.newDocumentBuilder();
文档DOC = builder.parse( “资源/ userConfig.xml”);
该代码在食,但在导出的jar文件不一样。当我运行导出的罐子它无法找到在C XML:\用户...
对于你的情况,你需要的一个,但低于去年的方法,即采用一个InputStream。最后一种方法是添加为你的情况与在类路径的jar文件的例子。您可能需要以不同的方式做exceptionhandling。
public class XMLLib {
public static DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
public static Document readXML(File file) {
try {
final DocumentBuilder builder = builderFactory.newDocumentBuilder();
return builder.parse(file);
} catch (ParserConfigurationException ex) {
return null;
} catch (SAXException | IOException ex) {
return null;
}
}
public static Document readXML(InputStream is) {
try {
final DocumentBuilder builder = builderFactory.newDocumentBuilder();
return builder.parse(is);
} catch (ParserConfigurationException ex) {
return null;
} catch (SAXException | IOException ex) {
return null;
}
}
//example call:
public static Document getDocumentResource(String resourcepath){
try (InputStream is = XMLLib.class.getResourceAsStream(resourcepath)){
return readXML(is);
} catch (IOException ex) {}
return null;
}
}
一些更多的交代:在Eclipse环境中的XML文件提取出来,这样你就可以直接访问它作为一个文件(因为它是一个“文件”)。现在,在一个罐子里的一切,所以你必须从JAR文件中提取的XML不存在,作为一个“文件”了。类装入器能够通过的getResourceAsStream这样做 - 就像它可以读取其他资源和类。因此,在本质上,这是什么做的是加载,如Java的XML加载的类。对于工作,resourcepath必须相对于类路径给出。以上仅InputStream的版本将工作(或一些其它的形式给出,例如使用路径和文件系统)
Usualy如果你在“资源/ userConfig.xml”有一个资源的路径是简单的“/userConfig.xml”。 (但是这取决于项目是如何组装的)
我只能猜测(取决于项目是如何组装)在您的情况,您需要:
Document document = XMLLib.getDocumentResource("/userConfig.xml");
重要提示:为InputStream版在罐子里,用提取的文件的文件(这是百达) - 只要它可以被加载器找到。