getResourceAsStream读取jar包里的xml。(解决file not found)
发布时间:2020-12-16 05:14:17 所属栏目:百科 来源:网络整理
导读:前几天在弄xml的时候, 想通过文件路径来读取项目里的xml配置文件。 在测试的时候没有任何问题, 但是当打包到jar文件里面之后, 再从另一个项目引用的时候,就出错了。 private static String getPathByName(String name,Class? clz){ URL url=clz.getClassL
前几天在弄xml的时候, 想通过文件路径来读取项目里的xml配置文件。
在测试的时候没有任何问题, 但是当打包到jar文件里面之后, 再从另一个项目引用的时候,就出错了。 private static String getPathByName(String name,Class<?> clz){ URL url=clz.getClassLoader().getResource(name); System.out.println("url = "+url); String result=url.getPath(); System.out.println(url.getPath()); return result; } 这就是出问题的代码。 当在该项目中运行的时候, 会自动查找源码的路径, 然后就可以通过这个路径来读取源码下的xml文件。 但是当我用maven引用该项目的时候, 这个路径就会被指向到jar文件里面的内容。 比如 pro.jar!/config.xml 这个路径是根本没法读取里面内容的。 =========解决方案======== 根据http://www.cnblogs.com/javayuer/archive/2011/01/02/1924192.html的内容以及hibernate源码, 最后找到解决方案。 hibernate的ConfigHelper里面的代码 public static InputStream getResourceAsStream(String resource) { String stripped = resource.startsWith("/") ? resource.substring(1) : resource; InputStream stream = null; ClassLoader classLoader = ClassLoaderHelper.getContextClassLoader(); if (classLoader!=null) { stream = classLoader.getResourceAsStream( stripped ); } if ( stream == null ) { stream = Environment.class.getResourceAsStream( resource ); } if ( stream == null ) { stream = Environment.class.getClassLoader().getResourceAsStream( stripped ); } if ( stream == null ) { throw new HibernateException( resource + " not found" ); } return stream; } 这里的关键就是getResourceAsStream, 这里的参数和上面URL的参数的区别就是, 这个参数不是绝对路径, 而是通过jar内部的相对路径来获取。 具体怎么一个机制我也不知道, 反正改成这样就没问题了。 public static Document getDocByFileStream(String fileName,Class<?>clz){ // String path=PathUtil.getPathByName(fileName,clz); SAXReader reader=new SAXReader(); Document doc=null; try { // doc=reader.read(new FileInputStream(new File(path))); doc=reader.read(PathUtil.class.getClassLoader().getResourceAsStream(fileName)); } catch (DocumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } return doc; } 而且这里也不需要去通过反射获取绝对路径了, 直接输入文件名称就ok了。 ===================== 另外一点, 在eclipse里面的maven项目中, 如图所示, src/main/java下的xml文件是无法通过该方法获取的。(仔细看一下jar包, 发现这个目录下的xml文件根本没有被打包进去) ======================================== 10/10更新 这个项目的设计是用xml文件作为数据库, 并且存放在本地硬盘上。 今天试了一下用classloader的getResourceAsStream获取xml, 大概明白了。 由于数据库是在硬盘上, 所以要获取这个inputstream其实很简单, InputStream stream=new FileInputStream(filepath); 这样就行了。 也就是说输入绝对路径便可以获取了。 而对于项目系统内部的配置文件,就不能这样了。 必须用反射。 classloader在这里就起到了作用。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |