SpringBoot项目打包部署Linux后访问不到resources下的文件

目录

问题

分析问题

一 :项目结构和代码展示

二 : 问题分析

1.猜测是不是文件路径的问题

2. 猜测是不是getPath()获取的path有问题

3.修改代码,继续测试

4.思考


 

问题

        在Springboot项目中,需要从resources中读取图片文件,在idea中运行得没问题,但部署到linux运行的时候,却报了以下错误,如下图:

cbf2217c9bfa4cb0ab1e834207c07e42.png


分析问题

一 :项目结构和代码展示

 项目结构,如下图:

29528ad12f2f467fab0ef305b9b9a0ce.png

代码:

7099af01760b4aed81f1e92475187f96.png

      


二 : 问题分析

        通过上面代码看,好像没看出什么问题。经过自己查找资料和翻阅博客,发现要解决这个问题,需要很庞大的知识体系才可以弄懂,而我也只知个大概,下面把我理解的写下,希望能帮助到你。

1.猜测是不是文件路径的问题

        首先,需要知道类加载相关知识,在JVM中,类都是懒加载的,当我们需要用到的时候才会被加载进JVM中,而在springboot中,类加载器是从classPath下,去加载文件。此时,在springboot中如果我们需要加载文件,可以通过以下3种方式:

  •        Class.getClassLoader().getResource(String path)
  •         Class.getResource(String path)
  •         new ClassPathResource(String path)

      对于Class.getClassLoader().getResource(String path)和new ClassPathResource(String path)来说,他们已经是从classPath下读取文件,如果再加"/"开头,例如:"/static/img/template.png"就会报错。而对于 Class.getResource(String path)来说,可以加"/"开头,也可以不加"/"开头,它底层还是调到Class.getClassLoader().getResource(String path)去,但如果path不加"/",例如"static/img/template.png",则代表是相对路径,表示相对于当前运行这行代码的类,此时会加上 包名+static/img/template.png。而加上"/",也是从classPath下读取文件。

        而我上面代码例子是通过以下方式加载,看起来是没有问题,不管是在idea中运行,还是达成jar放在linux中运行,都能够从项目中,找到这个文件,那代表不是文件路径的问题。

Test1.class.getClassLoader().getResource("static/img/template.png")

 

2. 猜测是不是getPath()获取的path有问题

        此时修改代码如下,打包成jar包,进行测试,代码如下:

dd455e2449f5402c88f7be47a0ec0b9b.png

 运行结果,如下:

c81d5ac6918045cfbc17b4b8e5233eeb.png

  结果打印出来了,并且可以看到有报错信息,就是开头所说的问题。

为了更清晰的观看和理解,我也把在idea中运行的结果贴出来,如下:

a96364a5c6904e02a6f4739ddd85e210.png

   而在idea运行的代码,却没有任何报错信息。

         通过 path对比,可以明显猜到,问题应该是出这路径和文件定位方面。这里有篇文章解释了大概问题,点击跳转可以观看。大概说了new File(),只能定位到文件系统,而对于像jar这些压缩包却无法使用,此时推荐使用getInputStream()流的方式来读取文件。

 

3.修改代码,继续测试,代码如下:

412b8dec57cb4e159d54752e687afc92.png

测试结果正常 ,可以正常读取。用ClassPathResource也行,也可以正常运行。推荐大家尽量都用ClassPathResource来读取文件,而对于new File()来说,代码中尽量少用,它可能在window中能正常运行,在Linux中可能就会运行异常了。

 

4.思考

        上面打印出path的路径的时候,发现有很多使用!/分隔开的路径,这个与springboot内部扩展出来的URL协议有关,有兴趣的可以点击 链接跳转查看相关内容。

path路径打印结果:

a9bd1d9bdcf54ca0b8f0cf1bcdf61e98.png

 

 

  • 22
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值