`

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在这里就起到了作用。
  • 大小: 22.7 KB
分享到:
评论

相关推荐

    Java源文件读取JAR包文件.rar

    要从JAR文件中读取内容,Java提供了一个内置的`java.util.jar`包,其中包含`JarFile`和`JarEntry`类。以下是一步步实现这个功能的方法: 1. **打开JAR文件**:使用`JarFile`类的构造函数,传入JAR文件的路径。这将...

    java 读取jar包文件

    在Java编程中,读取jar包内的文件是一个常见的需求,特别是在运行时动态加载资源或类文件时。Java提供了一种内置的方式,通过`java.util.jar`包中的`JarFile`和`JarInputStream`类来实现这个功能。下面将详细介绍...

    读取war包或jar包内的文件

    标题"读取war包或jar包内的文件"涉及到的知识点主要是如何在程序中动态地获取并读取这些归档文件中的内容,这对于理解和处理Java应用的部署和运行至关重要。这篇博客(虽然链接未提供具体内容)可能探讨了以下关键点...

    解决SpringBoot jar包中的文件读取问题实现

    在SpringBoot应用中,文件读取是一个常见的需求,但在打包成jar文件并部署后,由于文件不再位于文件系统中,而是被包含在jar包内部,所以传统的文件读取方式会失效。本文将深入探讨如何解决SpringBoot jar包中的文件...

    jar包里读取图片.rar ,,自己写的例子

    总结来说,从JAR包中读取图片涉及对Java类路径的理解,以及正确使用`getResource()`或`getResourceAsStream()`方法。在实际项目中,这通常是通过封装在静态方法或工具类中,以便在多个地方复用。对于开发者来说,...

    Java实现从jar包中读取指定文件的方法

    此外,如果你需要频繁地从JAR中读取资源,可以考虑使用`Class.getResourceAsStream()`或`ClassLoader.getResourceAsStream()`方法,它们允许你通过类路径(相对于类或类加载器)访问资源,而无需显式打开`JarFile`。...

    jar 包 内文件读取 文件内容

    System.out.println("File not found in the JAR."); } } catch (IOException e) { e.printStackTrace(); } ``` 6. **优化性能**: - 如果需要频繁访问JAR内的文件,考虑使用`JarURLConnection`和`...

    Eclipse打包成JAR包读取外部JAR包和外部配置文件(源码)

    下面我们将详细探讨如何在Eclipse中打包JAR包,并读取外部JAR包和外部配置文件。 首先,我们需要了解JAR文件的结构。JAR文件是Java类文件和相关资源的容器,它们被组织成目录结构,类似于Unix或Windows的文件系统。...

    读取jar文件

    ### 读取jar文件中的资源知识点 #### 一、引言 在开发过程中,经常会遇到需要从jar包中读取资源文件(如图片、音频等)的情况。这涉及到如何定位和访问这些文件的问题。本文将深入探讨如何在Java环境中有效地处理这...

    SpringBoot如何读取war包jar包和Resource资源

    SpringBoot读取war包jar包和Resource资源 SpringBoot 中读取 war 包 jar 包和 Resource 资源是开发过程中的常见问题。下面是相关知识点的总结: 1. ClassLoader 获取资源文件 在 SpringBoot 项目中,使用 ...

    ibatis 的 jar包

    【标题】"ibatis 的 jar包" 在Java开发中,iBATIS是一个强大的持久层框架,它能够将SQL语句与Java代码分离,提供了一种简单但有效的对象关系映射解决方案。这个“ibatis-2.3.4.726.jar”文件是iBATIS框架的一个特定...

    dom4j从jar包中读取xml文件的方法

    在标题和描述中提到的问题,是关于如何在Java应用中,特别是当XML文件被包含在JAR包内时,如何使用DOM4J进行读取。这个问题的关键在于理解Java类加载器(ClassLoader)的工作原理,以及如何利用它来访问JAR包内的...

    mybatis jar包及入门开发步骤学习

    - 使用SqlSessionFactoryBuilder读取mybatis-config.xml文件,创建SqlSessionFactory实例。 - 代码示例: ```java InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); ...

    JAVA打包后读取自身JAR中的文件.pdf

    ### JAVA打包后读取自身JAR中的文件 #### 背景介绍 在Java开发过程中,经常需要将项目...通过上述解决方案和注意事项,可以在Java程序中正确地处理打包后的JAR文件中的资源文件读取问题,确保程序的稳定性和可靠性。

    详细介绍使用Dom4j读取xml文件的方法

    这一步可以通过添加Dom4j的jar包至项目的类路径中实现。如果你使用的是Maven或者Gradle等构建工具,则可以在pom.xml或build.gradle文件中添加相应的依赖。 #### 三、示例代码解析 本节将对给定的部分内容进行详细...

    ibatisjar包

    Ibatisjar包是Java开发中的一个关键组件,主要用于简化数据库操作。它是一个轻量级的持久层框架,由Clinton Begin创建,并在2005年首次发布。Ibatis这个名字来源于"i"(互联网)和"bati"(基础数据访问工具),它...

    Jar包中如何正确地加载资源文件博文中用到的测试项目源码

    虽然这个包主要用于处理文件系统路径,但也可以通过`FileSystem`和`Path`接口来读取JAR中的资源: ```java Path jarPath = Paths.get("path_to_your_jar.jar"); FileSystem fs = FileSystems.newFileSystem(jarPath...

    dom4j.jar.jar

    XML用于保存及交换数据,与读取配置文件的类在同一包,或在WEB-INF(或其子目录下),// 读取配置文件获得一个输入流 InputStream is = Demo1.class.getResourceAsStream("/students.xml");// src目录下 // 1. 获得...

    附带资源的jar包

    在Java开发中,"附带资源的jar包"是一个常见的概念,它指的是包含有除了Java类文件之外的其他资源文件的Java Archive (JAR) 文件。这种jar包不仅封装了可执行的Java代码,还包含了运行时需要的各种资源,如图片、...

Global site tag (gtag.js) - Google Analytics