解决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包之后无法读取外部的静态资源问题的主要内容,如果未能解决你的问题,请参考以下文章

Springboot打成JAR包后读取外部配置文件

springboot打成jar包后如何访问数据库

自定义jar配置文件问题?

2023.3.4 Bug记录:Springboot打成jar包后,jsp页面无法刚问

jar方式运行项目-读取jar包中的文件

Springboot项目打成jar包时,执行jar包出现中XXX.jar没有主清单属性