本文讲述了在IDEA和Eclipse中访问resources目录下文件时的差异与解决方案。Eclipse能直接通过代码访问src下的资源文件,而IDEA需将资源置于resources目录下。作者分析了IDEA的资源处理机制,并提供了几种通过classLoader或Class的getResourceAsStream()方法访问resources目录下文件的方式,并指出需将文件放在"src/main/resources"目录下。最后,作者还分享了IDEA的配置尝试及一些建议,鼓励大家交流学习。
背景:最近有机构的同事咨询,用idea开发的时候,读取不到resources目录下的文件,eclipse是可以的,代码是这么写的:
InputStream resourceAsStream= this.getClass().getClassLoader().getResourceAsStream("/resources/card2.pdf");
于是开始研究idea配置之路
分析:通过classLoader获取文件资源流,eclipse中可以获取到表示代码没有问题,那么猜测应该是开发工具不同,对resources文件的处理不同,导致eclipse可以idea不行。
经过一定了解,eclipse会把src下的资源文件一起打包到classpath文件中,idea需要把资源文件放置在resources目录下,不识别其他目录。idea编译之后把字节码文件放到classes目录下,而classLoader获取文件的相对路径默认就是classes目录,然而资源文件一般默认的层级是在src/main/resources这里,编译之后会在classes平级的目录下生产resources目录,所以要访问资源文件就需要到resources目录下。
解决:
既然classLoader获取到的是classes目录,resources和他平级,那我们根据相对路径就可以访问到resources目录下的资源文件,代码:
InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("../resources/card.pdf");
2. idea配置的gradle项目其实和maven类似,也会把resources文件夹下的文件直接复制到classes目录下,即通过以下路径也可以访问:
InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("card2.pdf");
3. 通过Class.getResourceAsStream()也可获取,代码:
InputStream resourceAsStream = this.getClass().getResourceAsStream("/card2.pdf");
关于classLoader和Class的getResourceAsStream()的区别可自行详细了解
注意:
文件需放在resources文件夹下,即在src/main/resources目录下,其他目录访问不到
注意需要不需要加“/”的问题
文件放置在resources目录下暂时没有找到“/resources/xxx.xxx”访问的方式(有人知道的话欢迎一起云之家交流)
最后附上我idea的配置,试了加很多东西,最终发现没什么效果
文件目录加了三种类型,最终发现只有在“src/main/resources”目录下的文件可通过上述三种方式访问
out/production为编译生成的文件的根目录
project Structure配置如图,resources配置为资源文件类型(编译好像是会默认把这个文件设置为资源文件夹,其他的文件夹好像是就算这里设置了,编译后也会取消)
Output path为 F:\cosmicDev\cosmic-2.0\bos-dev-tool\debug-service\node-debug-mservice\out\production\classes,和图一的out文件吻合
还配置了idea的.gradle文件和build.gradle文件,最终尝试没有实际效果,配置和不配置效果一样,这里贴一下截图提供一个思路:
也是在遇到问题慢慢了解学习的阶段,如果哪里写的有问题希望大家能多多指正,欢迎大家一起沟通交流【emoji】
推荐阅读