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

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

原文地址:https://www.cnblogs.com/yisany/p/10228719.html

时间: 2024-08-14 09:40:50

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

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

#项目打包后安装的桌面快捷方式图标怎么设置成自己想要的图标 2012-08-25 09:11匿名 | 浏览 3286 次 C#编程 C#项目用vs2005自带的工具打包后安装的桌面快捷方式图标怎么设置成自己想要的图标,就想QQ安装之后在桌面的快捷方式一样 2012-08-25 09:21网友采纳 在创建快捷方式的时候是可以指定图标的啊.当然你最好把那图标文件(扩展名是ico)放在打包的文件夹中,不然你是不能指定的.

vue项目打包后css背景图路径不对的问题

问题描述: 自己在自学vue做项目的过程中,遇到一个有关背景图片路径的问题,就是css代码中背景图片是根据相对路径来写的,如下图: 当使用npm run dev命令本地访问的时候,背景图片是正常显示的,可使用npm run build命令打包后,访问dist目录下的项目,页面背景图路径就不对了,显示不出背景图.如下两张图对比 图一:使用npm run dev命令访问 图二:使用npm run build命令打包之后,访问dist目录下的文件,出现的问题,背景图片路径变成了http://127.0

Eclipse中创建新的SpringBoot项目(打包并且部署到tomcat)

Spring-boot因为其对jar包的高度集成以及简化服务配置,快速部署等的优点,逐渐成为Java开发人员的热衷的框架.下面演示一下怎么在Eclipse中新建Spring-boot项目以及打包部署. 在Eclipse中创建Spring-boot有两种方式 方式一 进入Spring-boot的在线配置网站http://start.spring.io/:定制自己的项目服务组件,下载到本地并使用Eclipse导入项目 服务组件: Web:web项目组件,包含spring mvc,tomcat,log

SpringBoot 项目打包分开lib,配置和资源文件

原文地址:https://blog.csdn.net/u012811805/article/details/80878848 1 jar启动分离依赖lib和配置 先前发布boot项目的时候,改动一点东西,就需要将整个项目重新打包部署,十分不便,故把依赖lib从项目分离出来,每次部署只需要发布代码即可.1.1 半自动化步骤1.1.1 更换maven的jar打包插件 先前使用的是spring-boot-maven-plugin来打包,这个插件会将项目所有的依赖打入BOOT-INF/lib下,替换为m

SpringBoot项目打包

@SpringBootApplication public class TestpackagewarApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(TestpackagewarApplication.c

react项目打包后路径找不到,项目打开后页面空白的问题

使用 npm install -g create-react-app快速生成项目脚手架打包后出现资源找不到的路径问题: 解决办法:在package.json设置homepage 原文地址:https://www.cnblogs.com/lan-cheng/p/10541606.html

vue项目打包后图片以及图标不展示

打包后的index.html在浏览器中打开你会发现图片资源和图标资源未展示出来,此时我们可以在浏览器中检查资源路径,你会发现它是相对于dist文件夹下的路径(static/img/0.65fe52c.jpg),但实质上当我们把该文件夹上传至服务器后该路径是相对于项目根目录来定位的,应该是(../../static/img/0.65fe52c.jpg),故而查找不到资源.我们子啊一个项目中肯定不只一处使用这样的静态资源,那么我们要打包后一个一个去更改吗?必然不是,我们只需要在build/utils

SpringBoot项目打包出错

首先确定项目都能跑通的情况下,在跟项目打包时报错 Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.21.0:test (default-test) on project spring_boot: There are test failures. 大概意思是测试文件打包失败. 既然失败,那就忽视测试文件. 在测试类中添加给注解@Ignore @Ignore 在类上添加就是忽视这个类, 在方法上添加就是忽

Vue项目打包后背景图片路径错误

vue项目打包之后背景图片出错的解决方案如下: 1,找到 config->index.js里面,如下修改 默认配置: env: require('./prod.env'), index: path.resolve(__dirname, '../dist/index.html'), assetsRoot: path.resolve(__dirname, '../dist'), assetsSubDirectory: 'static', assetsPublicPath: '/', 修改为: env