经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
SpringBoot 项目打包后获取不到resource下资源的解决
来源:cnblogs  作者:Yisany  时间:2019/1/7 9:53:44  对本文有异议

SpringBoot 项目打包后获取不到resource下资源的解决

在项目中有几个文件需要下载,然后不想暴露真实路径,又没有CDN,便决定使用接口的方式来获取文件。最初的时候使用了传统的方法来获取文件路径,发现不行。查找资料后发现是SpringBoot框架导致的,得用另外的方法:

  1. //听说在linux系统中会失效。
  2. //不用听说了,就是会挂,血的教训
  3. String path = ResourceUtils.getURL("classpath:").getPath();
  4. //此方法返回读取文件字节的方式在linux系统中无异。
  5. InputStream inputStream = getClass().getClassLoader().getResourceAsStream("RSA/privateKey.txt");
  6. //声明io的resources对象也可访问
  7. Resource resource = new ClassPathResource(uploadPath+privateKeyFileName);
  8. // 此方法用来写文件或上传文件在本项目中指定路径。
  9. String privateKeyFileStr = request.getSession().
  10. getServletContext().getRealPath("RSA/privateKey.txt");

刚开始的时候用的就是第一种方法,初生牛犊不怕虎吧,说不定在linux上就行呢,本地环境测试通过,然后再上linux测试环境,不出意外,挂了。

  1. //听说在linux系统中会失效。
  2. //不用听说了,就是会挂,血的教训
  3. String path = ResourceUtils.getURL("classpath:").getPath();

乖乖使用其他的方法,这里选择使用了第三种方法:

  1. public byte[] downloadServerCrt() {
  2. try {
  3. Resource resource = new ClassPathResource("static/syslog/cert/server.crt");
  4. byte[] bytes = readFileInBytesToString(resource);
  5. return bytes;
  6. } catch (Exception e) {
  7. throw new Exception("下载失败" + e.getMessage());
  8. }
  9. }

这里还有一个坑,也是踩过了才知道,这边的resource是Resource类型的变量,刚开始我使用了resource.getFile()方法获取到File对象然后再采用IO流进行操作,即:

  1. File file = resource.getFile();
  2. DataInputStream isr = new DataInputStream(resource.getInputStream());
  3. ...

在IDE中运行是完全没有问题的,但使用mvn打包成jar包后,再运行就会提示ERROR:

  1. java.io.FileNotFoundException: class path resource [static/syslog/cert/server.crt] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/home/admin/dtlog-web/lib/log-web-3.0.2.jar!/static/syslog/cert/server.crt

后来查阅了资料说:一旦打成jar包后,使用File是访问不到资源的内容的,推荐使用getInputStream()的方法,修改后:

  1. InputStream in = resource.getInputStream();
  2. DataInputStream isr = new DataInputStream(in);
  3. ...

测试没有问题,bug解决。

参考资料

Springboot 访问resources目录文件方式

Classpath resource not found when running as jar

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号