解读classpath读取resources目录下的文件
classpath读取resources目录下文件
最近在springboot+maven的项目中去读取资源文件的时候,报了找不到文件的错误。
由此展开了对maven项目编译前和编译后的目录结构的了解,以及对java的classpath的理解。
首先:
由Maven构建的web工程,java代码放在src/main/java路径下,资源(配置文件等)放在src/main/resources路径下,当构建jar包 或 war包时,JVM虚拟机会自动编译java文件为class文件存放在 target/classes目录下,resource资源下的文件会原封不动的拷贝一份到 target/classes 目录下:而我们一般取的classpath就是target/classes目录
你可以通过这种方式打印你的calsspath
A.class.getClassLoader().getResource("").getPath();
这里又引出一个话题,我们可以根据两种不同的方式去获取Resources下的文件
1、class.getResource()
import org.junit.jupiter.api.Test; public class ResourceTestDemo { @Test void getResourceTest(){ System.out.println(ResourceTestDemo.class.getResource("")); System.out.println(ResourceTestDemo.class.getResource("/")); }
打印结果:
1、file:/Users/username/Documents/TestDev/MyTraining/XUnit/ResourceTest/target/classes/3.txt
2、file:/Users/username/Documents/TestDev/MyTraining/XUnit/ResourceTest/target/classes/test/2.txt
结果分析:
- 1、getResource("")不带"/“时候是从当前类所在包路径去获取资源
- 2、getResource("/")带”/"时候是从classpath的根路径获取
2、getClassLoader().getResource()
@Test void getClassLoaderResourceTest(){ System.out.println(ResourceTestDemo.class.getClassLoader().getResource("")); System.out.println(ResourceTestDemo.class.getClassLoader().getResource("/")); }
打印结果:
file:/Users/qinzhen/Documents/TestDev/MyTraining/XUnit/ResourceTest/target/test-classes/
null
class.getResource()
不带"/"时候是从当前类所在包路径去获取资源class.getResource()
带"/"时候是从classpath的根路径获取class.getResource()
本质上也是调用了getClassLoader,只是封装了一层方便了我们使用而已getClassLoader().getResource("")
不带"/"时候是从classpath的根路径获取getClassLoader().getResource("/")
路径中无法带有"/"getResourceAsStream()
方法仅仅是获取对应路径文件的输入流,在路径的用法上与getResource()一qu
4、批量读取
如果想要批量读区resource下的文件呢?
Resource[] resources = ResourceTestDemo.class.getClassLoader().getResources("validator-config/*.xml"); for (int i = 0; i < resources.length; i++) { InputStream inputStream = resources[i].getInputStream(); String xmlContent = IOUtils.toString(inputStream, "UTF-8"); System.out.println("content" + i + "=" + xmlContent); }
5、如果配置文件中要引用这个文件的路径呢?
用classpath:xxx.xml 就可以了(xxx.xml放在resources目录下)。注意是springboot的项目
如果还是取不到,看看你的maven工程的pom文件是否做了过滤文件,比如.keystore文件
<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <excludes> <exclude>*.keystore</exclude> </excludes> </resource> <resource> <directory>src/main/resources</directory> <filtering>false</filtering> <includes> <include>*.keystore</include> </includes> </resource> </resources> </build>
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
java.lang.IllegalStateException异常原因和解决办法
这篇文章主要给大家介绍了关于java.lang.IllegalStateException异常原因和解决办法,IllegalStateException是Java标准库中的一个异常类,通常表示在不合适或无效的情况下执行了某个方法或操作,需要的朋友可以参考下2023-07-07在拦截器中读取request参数,解决在controller中无法二次读取的问题
这篇文章主要介绍了在拦截器中读取request参数,解决在controller中无法二次读取的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-10-10解析SpringBoot整合SpringDataRedis的过程
这篇文章主要介绍了SpringBoot整合SpringDataRedis的过程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-06-06Spring @EventListener 异步中使用condition的问题及处理
这篇文章主要介绍了Spring @EventListener 异步中使用condition的问题及处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-12-12
最新评论