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");总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Mybatis-plus自定义SQL注入器查询@TableLogic逻辑删除后的数据详解
这篇文章主要给大家介绍了关于Mybatis-plus自定义SQL注入器查询@TableLogic逻辑删除后的数据的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2023-03-03
ServletContext读取web资源_动力节点Java学院整理
这篇文章主要介绍了ServletContext读取web资源,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-07-07


最新评论