idea启动与jar包启动中使用resource资源文件路径的问题
作者:某猿蚊常叮
这篇文章主要介绍了idea启动与jar包启动中使用resource资源文件路径的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
idea启动与jar包启动中使用resource资源文件路径
问题描述
项目直接用idea运行的时候好好的,但是打包成Jar之后却出现了莫名其妙的BUG,经过很长时间的调试之后,才发现是打包之后的文件路径出现了问题。
在原本的代码中使用的是这样的代码来读取resource中的文件
ClassLoader classLoader = this.class.getClassLoader(); URL appUrl = classLoader.getResource("center/AppStarter.java"); File appJava = new File(appUrl.getFile());
这样的代码直接运行时没问题的,能够正确的读取到文件,但是打包成jar之后,
在网上查找了很久,终于找到了解决方法。
读取resource中的文件需要使用InputStream来进行读取,然后转换成String。
具体实现可以参看下面的代码。
//2.创建输入流 String path = "META-INF/item.xml" InputStream is = this.getClass().getClassLoader().getResourceAsStream(path);
这样写了之后打包成jar后能够成功读取到resource中的文件
问题分析
在idea中可以通过绝对路径读取文件,但是package成jar包之后,路径的文件形式发生变化,但是可以通过class路径,然后通过相对路径的方式拿到文件流,达到文件内容的读取。
Jar包启动通过ClassPathResource获取不到文件路径
项目目录结构
maven项目resources目录也是会被编译到classpath下的。
ClassPathResource resource = new ClassPathResource("/map/map.properties"); InputStream inputStream = resource.getInputStream(); System.out.println("inputStream.available() = " + inputStream.available()); System.out.println("resource.getFile().getAbsolutePath() = " + resource.getFile().getAbsolutePath());
如果是使用idea进行本地开发时,是可以获取到classpath下的资源的路径的,因为是读取的磁盘上的真正的那个文件。
但是如果将项目打包成一个jar包后,再获取map.properties是获取不到的,对于操作系统来说最多只能读取到jar包,而不能再继续读取jar包里面的文件了,如果继续读取,只能交给jvm去读了,此时能读取到二进制流,而不能获取到路径。
可通过以下几种方式获取classpath下的资源
ClassPathResource classPathResource = new ClassPathResource("/map/map.properties"); InputStream cis = classPathResource.getInputStream(); //获取classpath下第一个/map/map.properties,这个根据jar包的加载先后顺序有关 InputStream ris = ClassPathResource.class.getClassLoader().getResourceAsStream("/map/map.properties"); //这个是获取classpath下所有的map/map.properties,在jvm运行时,所有jar都相当于是一个classpath Enumeration<URL> resources = ClassPathResource.class.getClassLoader().getResources("/map/map.properties");
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。