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. 乱序优化与GCC的bug

      以下内容来自搜狗实验室技术交流文档,搜狐公司研发中心版权所有,仅供技术交流   摘要 --------- 乱序优化是现代编译器非常重要的特性,本文介绍了什么是乱序优化,以及由此引发的一个bug,希 ...

  2. 形态形成场(矩阵乘法优化dp)

    形态形成场(矩阵乘法优化dp) 短信中将会涉及前\(k\)种大写字母,每个大写字母都有一个对应的替换式\(Si\),替换式中只会出现大写字母和数字,比如\(A→BB,B→CC0,C→123\),代表 ...

  3. mybatis 批量update两种方法对比

    <!-- 这次用resultmap接收输出结果 --> <select id="findByName" parameterType="string&qu ...

  4. iOS 11 ScrollView偏移问题解决

    if (@available(iOS 11.0, *)){//避免滚动视图顶部出现20的空白以及push或者pop的时候页面有一个上移或者下移的异常动画的问题 [[UIScrollView appea ...

  5. 设置django在linux后台运行&查看端口使用

    1.后台运行(&),允许所有用户(0.0.0.0)访问,端口为8888 nohup python manage.py runserver 0.0.0.0 8888 & 2.由端口号88 ...

  6. 【实例分割】PANet简单笔记

    PANet是18年的一篇CVPR,作者来自港中文,北大,商汤与腾讯优图,PANET可看作Mask-RCNN+,是在Mask-RCNN基础上做的几处改进. 论文地址:https://arxiv.org/ ...

  7. P4824 [USACO15FEB]Censoring (Silver) 审查(银)

    传送门 一个串的匹配肯定考虑KMP 那就暴力KMP 记录一下到每个字符时匹配的位置 找到一个符合的串就标记然后暴力回跳 感觉好像太暴力了... #include<iostream> #in ...

  8. NAS与SAN RAID

    存储区域网络 SAN 存储区域网络(Storage Area Network,简称SAN)采用网状通道(Fibre Channel ,简称FC,区别与Fiber Channel光纤通道)技术,通过FC ...

  9. django模型层 关于单表的增删改查

    关于ORM MTV或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库, 通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员 ...

  10. spring boot 系统启动时运行代码(1)-@PostConstruct

    Application.java import org.springframework.boot.SpringApplication; import org.springframework.boot. ...