苍穹轻量级环境使用idea开发,读取resources目录下的文件原创
金蝶云社区-JeremyG
JeremyG
7人赞赏了该文章 3,134次浏览 未经作者许可,禁止转载编辑于2020年05月12日 20:37:28

背景:最近有机构的同事咨询,用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目录下。


解决

  1. 既然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()的区别可自行详细了解


注意

  1. 文件需放在resources文件夹下,即在src/main/resources目录下,其他目录访问不到

  2. 注意需要不需要加“/”的问题

  3. 文件放置在resources目录下暂时没有找到“/resources/xxx.xxx”访问的方式(有人知道的话欢迎一起云之家交流)


最后附上我idea的配置,试了加很多东西,最终发现没什么效果

image.png

文件目录加了三种类型,最终发现只有在“src/main/resources”目录下的文件可通过上述三种方式访问

out/production为编译生成的文件的根目录


image.png

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文件,最终尝试没有实际效果,配置和不配置效果一样,这里贴一下截图提供一个思路:

image.png

image.png


也是在遇到问题慢慢了解学习的阶段,如果哪里写的有问题希望大家能多多指正,欢迎大家一起沟通交流【emoji】

赞 7