getResourceAsStream读取jar包里的xml解决file not found

前几天在弄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在这里就起到了作用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类
XML入门的常见问题(二)
Java对象的强、软、弱和虚引用
JS解析XML文件和XML字符串详解
java中枚举的详细使用介绍
了解Xml格式
XML入门的常见问题(四)
深入SQLite多线程的使用总结详解
PlayFramework完整实现一个APP(一)
XML和YAML的使用方法
XML轻松学习总节篇