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

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

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

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

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

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

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

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

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

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

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()的方法,修改后:

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

测试没有问题,bug解决。

参考资料

Springboot 访问resources目录文件方式

Classpath resource not found when running as jar

SpringBoot 项目打包后获取不到resource下资源的解决的更多相关文章

  1. SpringBoot 项目打包后运行报 org.apache.ibatis.binding.BindingException

    今天把本地的一个SpringBoot项目打包扔到Linux服务器上,启动执行,接口一访问就报错,但是在本地Eclipse中启动执行不报错,错误如下: org.apache.ibatis.binding ...

  2. Springboot项目打包后的页面丢失问题(thymeleaf报错)

    遇到的问题目前找到两种: 返回视图路径以/开头,例如 /test/hello 在thymeleaf页面中,引入的页面以/开头,例如:<footer th:replace="/index ...

  3. SpringBoot项目打包成jar后,启动脚本

    将springboot项目打包成jar后,上传至服务器,每次都需要手敲命令,重新部署项目,可将这些命令写入脚本中,直接运行. 启动脚本(start.sh): CUR_PATH=$(cd "$ ...

  4. maven将自己的springboot项目打包成jar包后,作为工具包引入其他项目,找不到jar中的类

    将springboot项目打包成jar包,作为工具包导入项目后,找不到jar中的类. 原因是:springboot项目使用了自动的打包插件. 原先的插件配置: <build> <pl ...

  5. springboot打成jar后获取classpath下文件失败

    原文链接:https://blog.csdn.net/qq_18748427/article/details/78606432 springboot打成jar后获取classpath下文件失败 使用如 ...

  6. ******可用 SpringBoot 项目打包分开lib,配置和资源文件

    spring-boot多模块打包后,无法找到其他模块中的类https://blog.csdn.net/Can96/article/details/96172172 关于SpringBoot项目打包没有 ...

  7. springboot项目打包成jar/war包

    springboot项目打包过程中包含第三方jar 开发IDE是IntelliJ IDEA,数据库是mysql,内置服务器tomcat. 打包步骤: 1. 确定项目调试运行没问题 2. 将第三方jar ...

  8. vue项目打包后运行报错400如何解决

    昨天一个Vue项目打包后,今天测试,发现无论localhost还是服务器上都运行不了,报错如下: Failed to load resource: the server responded with ...

  9. C#项目打包后安装的桌面快捷方式图标怎么设置成自己想要的图标

    #项目打包后安装的桌面快捷方式图标怎么设置成自己想要的图标 2012-08-25 09:11匿名 | 浏览 3286 次  C#编程 C#项目用vs2005自带的工具打包后安装的桌面快捷方式图标怎么设 ...

随机推荐

  1. Shell---自动测试局域网内的网络连通情况

    #!/bin/bash );do RE=`ping .$i` echo $RE >>result.log done

  2. 《图解HTTP》阅读笔记-第五章-web服务器

      第五章.与HTTP协助的web服务器单台虚拟主机实现多个域名可以用单台物理主机运行多台虚拟主机,这些虚拟主机的IP相同,而虚拟主机有可以寄存多个不同主机名和域名的web网站,所以要保证发送HTTP ...

  3. 微信小程序强制横屏办法

    最近想学习学习微信小程序开发,本着先设计,再查找具体实现的方法的想法,在进行数据统计时,想着竖屏展示数据会造成重叠,或者数据显示不全而用省略号代替的问题,所以计划采用横屏的方式显示数据表格. 搜索到两 ...

  4. PAT天梯赛L1-020 帅到没朋友

    题目链接:点击打开链接 当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有朋友.本题就要求你找出那些帅到没有朋友的人. 输入格式: 输入第一行给出一个正整数N(<=100),是已知朋 ...

  5. svn显示提交人以及时间

    eclipse使用svn显示提交人以及提交时间,方便查看自己修改过的代码,过程如下: Window-->Preferences-->Team-->SVN-->Lable dec ...

  6. LUNA16数据集(一)简介

    LUNA16,全称Lung Nodule Analysis 16,是16年推出的一个肺部结节检测数据集,旨在作为评估各种CAD(computer aid detection计算机辅助检测系统)的ban ...

  7. pre 标签 防止 其撑开 div...

    pre 里面 的内容如果不换行,会导致 div 横向 出现 滚动条...加入下列 css可解决! pre{ white-space: pre-wrap; word-wrap: break-word; ...

  8. HDU1085 Holding Bin-Laden Captive!

    Description We all know that Bin-Laden is a notorious terrorist, and he has disappeared for a long t ...

  9. 关于let 和 var 的作用域问题

    直接来一个经典案例: // 1. 下面的结果是什么? 为什么? for (var i=0;i<5;i++){ setTimeout(function () { console.log(i) }, ...

  10. c++ for_each( )学习

    for_each()事实上是個 function template,其实质如下  [effective STL item 41] template<typename InputIterator, ...