Springboot读取项目文件夹下文件之本地IDEA和打成jar后的区别

本文分析了Springboot项目中如何在本地开发和打包后访问根目录文件及资源文件夹的问题,比较了File、ResourceUtils和ClassPathResource三种方式,并提供了针对jar包部署的解决方案。
摘要由CSDN通过智能技术生成

1.Springboot访问项目根目录下的文件:

public static final String PROJECT_ROOT_DIRECTOR = System.getProperty("user.dir");

在本地Idea下访问是可以的,其对应本地的文件结构如下:

但是在打包成jar发布到线上服务器上会发现,存在问题。此时上面指定的文件夹是和jar同目录:

2.Springboot访问资源文件夹的路径:

补充知识:在springboot的resource下可以新建名称为static的目录,此目录是不安全的,可以直接外网访问,比如本地启动,static下有一个img/a.jpg,那么可以直接localhost:端口/服务名/img/a.jpg.前端页面也可以直接:src="img/a.jpg".

言归正传~~~~~~~~~~omg:

Q:访问resources/static/test.txt文件

2.1 传统方式:

File file = new File("src/main/resources/static/test.txt");
InputStream inputStream=new FileInputStream(file);

      打包成jar后,jar文件的目录结构不会从src开始,jar文件中的资源,读取时必须使用流的方式。

       File的构造参数必须是相对项目路径的根路径,如果项目下还有module,还需要添加module-name+src/main/....

结论:在idea上运行是可以的,但是打成jar包是会报文件找不到异常的File NOT FOUND EXCEPTION。

2.2 ResourceUtils工具类

File file = ResourceUtils.getFile("classpath:static/test.txt");
InputStream inputStream=new FileInputStream(file);

Idea启动没有问题;jar启动会报错:

class path resource [static/text.txt] cannot be resolved to absolute file path because it does not exist

(不能解析为绝对文件路径,因为它不在文件系统中)

结论:这种方式在idea上运行是可以的,但是打成jar包是会报文件找不到异常的。

2.3 ClassPathResource类

ClassPathResource classPathResource = new ClassPathResource("static/test.txt");
InputStream inputStream = classPathResource.getInputStream();

 注意:此除必须用流读取:

如果使用类似下列方式获取路径地址:

classPathResource.getFile().getAbsoluteFile().toString();

则会报错:

class path resource [static/text.txt] cannot be resolved to URL because it does not exist 

结论:Idea和jar都行。

附:jar解压的文件结构:

       在IDEA中module-name下有src/main/java和src/main/resource两个文件夹,两个文件夹下的针对打出的jar来说都在BOOT-INF下。不含有src/main目录。

项目工程目录结构:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值