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");总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Java中Stringbuild,Date和Calendar类的用法详解
这篇文章主要为大家详细介绍了Java中Stringbuild、Date和Calendar类的用法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下2023-04-04
SpringCloud使用AOP统一处理Web请求日志实现步骤
这篇文章主要为大家介绍了SpringCloud使用AOP统一处理Web请求日志实现步骤,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-08-08
SpringBoot整合新版SpringSecurity完整过程
Spring Security是保障Spring应用程序安全的强大框架,而新版的Spring Security引入了lambda表达式来配置,使得安全配置更加简洁、优雅,本文将介绍如何在Spring Boot项目中整合新版Spring Security,需要的朋友可以参考下2024-02-02


最新评论