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. upper_bound下确界

    //uppper_bound上确界找出首个大于某值的元素 #include<algorithm> #include<iostream> using namespace std; ...

  2. [hdu 1568] Fibonacci数列前4位

    2007年到来了.经过2006年一年的修炼,数学神童zouyu终于把0到100000000的Fibonacci数列(f[0]=0,f[1]=1;f[i] = f[i-1]+f[i-2](i>=2 ...

  3. Java基础之8个基本类型及基本类型间转换

    8种基本数据类型 Java语言有8种基本数据类型, 分别用于存储整数.浮点数.字符数据和布尔类型数据.需要注意的是: 现在所介绍的仅仅是基本数据类型,后续还会介绍很多非基本数据类型.基本数据类型如图 ...

  4. CSS之引入样式

    CSS引入样式 内部样式 内嵌式是将CSS代码集中写在HTML文档的head头部标签中,并且用style标签定义,其基本语法格式如下: <head> <style type=&quo ...

  5. QueryTask,FindTask,IdentifyTask三种查询的区别

    1:QueryTask是一个进行空间和属性查询的功能类,它可以在某个地图服务的某个子图层内进行查询,顺便需要提一下的是,QueryTask进行查询的地图服务并不必项加载到Map中进行显示.QueryT ...

  6. vue.js路由学习笔记

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  7. [Maven]How do I tell Maven to use the latest version of a dependency?

    Link: http://stackoverflow.com/questions/30571/how-do-i-tell-maven-to-use-the-latest-version-of-a-de ...

  8. Kibana源码启动报错记录--ENOSPC

    执行该命令可解决:echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysc ...

  9. AngularJs 中使用OpenLayer例子,手机端地图加载不显示问题

      var map, toolip, overlay;            var layer = new ol.layer.Vector();            var imgLayer = ...

  10. day18 约束 异常

    1. 类的约束 方案一:抛出异常,子类必须重写父类方法,否则会报错 class Base: def login(self): #强制xxx做XXX事 raise NotImplementedError ...