解决springboot打成jar包之后无法读取外部的静态资源问题
Posted 是Cc哈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决springboot打成jar包之后无法读取外部的静态资源问题相关的知识,希望对你有一定的参考价值。
在我的Ccmusic项目中由于需要上传图片、歌曲等,所以我将静态资源文件没有放在static文件夹下,而是放在了根目录下,通过重写addResourceHandlers进行重定向。
在本地运行是完全可以的,所以如果你的项目只要在本地上运行是可以的,但是如果讲jar包上传到服务器运行就找不到外部的静态资源文件了。
如果你的项目要打成jar包放到服务器上有如下的解决方式:
首先在springboot项目中的application.properties的配置文件中,添加下面的配置
server.tomcat.basedir=logistics/tomcat
此虚拟路径会在你把springboot项目打成jar包运行后在你的jar包同级目录下产生一个logistics目录。所以我把我要上传的文件的全部放在这个文件夹目录下
我将所有的外部资源文件都放在了这个logistics文件夹内。
但是还没有结束,这里面还有一个很大的坑,在服务器中jar包运行与本地jar包运行获取的路径不同,在项目上运行时不用返回两次父级目录,而打成jar包运行后获取的jar包的路径要如下的方法,并且打成jar包后获取的根目录会在目录前面加上file:/你项目的路径
/**
* 自定义mvc配置
* @author chenchen
*/
@Configuration
public class WebMvcConfig implements WebMvcConfigurer
/**
* 解决前后端访问跨域问题
* @param registry
*/
@Override
public void addCorsMappings(CorsRegistry registry)
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*")
.allowCredentials(true);
/**
* 图片重定向
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry)
// 解决上线后无法加载外部静态资源问题,若本地运行则不需要
File path = null;
try
path = new File(ResourceUtils.getURL("classpath:").getPath());
catch (FileNotFoundException e)
e.printStackTrace();
String gitPath = path.getParentFile().getParentFile().getParent() + File.separator + "logistics";
// 歌手图片地址
registry.addResourceHandler("/img/singerPic/**")
.addResourceLocations(// "file:" + System.getProperty("user.dir")
gitPath
+ System.getProperty("file.separator")
+ "img"
+ System.getProperty("file.separator")
+ "singerPic"
+ System.getProperty("file.separator"));
// 歌曲图片地址
registry.addResourceHandler("/img/songPic/**")
.addResourceLocations(// "file:" + System.getProperty("user.dir")
gitPath
+ System.getProperty("file.separator")
+ "img"
+ System.getProperty("file.separator")
+ "songPic"
+ System.getProperty("file.separator"));
// 歌单图片地址
registry.addResourceHandler("/img/songSheetPic/**")
.addResourceLocations(// "file:" + System.getProperty("user.dir")
gitPath
+ System.getProperty("file.separator")
+ "img"
+ System.getProperty("file.separator")
+ "songSheetPic"
+ System.getProperty("file.separator"));
// 歌曲资源地址
registry.addResourceHandler("/song/**")
.addResourceLocations(// "file:" + System.getProperty("user.dir")
gitPath
+ System.getProperty("file.separator")
+ "song"
+ System.getProperty("file.separator"));
//前端用户头像地址
registry.addResourceHandler("/avatorImages/**").addResourceLocations(
// "file:"+System.getProperty("user.dir")+
gitPath + System.getProperty("file.separator")+"avatorImages"+System.getProperty("file.separator")
);
//用户头像默认地址
registry.addResourceHandler("/img/**").addResourceLocations(
// "file:"+System.getProperty("user.dir")+
gitPath + System.getProperty("file.separator")+"img"+System.getProperty("file.separator")
);
//内部静态资源文件映射
registry.addResourceHandler("/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX+"/static/");
再次打成jar包后放在服务器上就可以正常的运行了。
以上是关于解决springboot打成jar包之后无法读取外部的静态资源问题的主要内容,如果未能解决你的问题,请参考以下文章