Springboot项目编译后未能加载静态资源文件的问题
作者:Mr.yuliu
Springboot项目编译后未能加载静态资源文件
起因
因甲方加了一个紧急的需求: 需要搞一个文件上传和下载功能.
我心中想:这不简单,搞个资源服务器,将上传文件放上去,然后访问资源链接就行了.
但接下来甲方爸爸说 不需要这莫麻烦,直接将文件放服务器里,用的时候下载到资源文件夹下就行.
我心里想: 我擦嘞 还能这样!! 然后小心心翼翼的说 有资源服务器会更好的进行统一管理,
说了些缺点..但人不想.哎! 那就撸代码吧 结果就发生一个莫名奇妙的事情.
原因
idea中项目启动,在将文件下载到资源路径下时报问题如下:
class path resource [***] cannot be resolved to URL because it does not exist
资源文件找不到错误,我擦.
然后楼主就翻了下编译后的文件夹
看到问题没,这里竟然少了一个资源文件夹.可楼主都配置了啊
配置如下:
maven配置:
资源文件文件夹配置:
就很奇,为啥编译后target->class下没有static
然后楼主就开始了长达20分钟的查找.百度的结果很乱,但都不能解决问题
最终楼主决定下去抽个烟!!!
思考
下去抽烟时 楼主就思考.配置路径正确,文件路径也没问题,为啥编译后没生成!
接下来楼主突然想到了种问题,会不会是资源文件下没有资源 导致maven在进行打包时会默认过滤掉没有资源的文件夹!
验证
楼主在static文件夹下 扔了一个文件 编译了下 然后就好使了.
就很神奇.
复盘
maven在编译的时候 会过滤掉空文件夹,咱们在使用的时候 增加默认文件就好
Springboot静态资源加载不到,并且配置了也不生效
问题描述,以及历程
写项目的时候导入了一个前端项目,加载的时候发现,竟然404,我估计就是没扫描到静态资源,我就跟之前一样写了一个配置类:
@Configuration public class WebMvcConfig extends WebMvcConfigurationSupport { @Override protected void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/**") .addResourceLocations("classpath:/static/") .addResourceLocations("classpath:/templates/"); super.addResourceHandlers(registry); } }
然后发现也不生效,
我就去搜,发现了各种配置的方法,继承这个类的,或者实现那个方法的,网上一搜一大堆,都不行,然后我又试了用配置文件配置,也就是yml,因为用的thymeleaf引擎模板的,所以,也配置了些thymeleaf的配置,能好点,起码能访问到首页的html了,但是依然静态资源加载不到,
还有说那个pom文件有那个过滤的,把那个删了就好,我查过那个问题了,我没有那个过滤的。
解决问题
经过一下午的排查,与搜索,终于找到了解决方法:我用的springBoot版本的问题:2.6.x就会有问题,需要引入配置,才能生效:
Springboot-2.6.x所使用到的spring mvc-5.3.x 默认的路径匹配策略改变了:
Spring MVC 处理程序映射匹配请求路径的默认策略已从 AntPathMatcher 更改为PathPatternParser。所以我们得给他设置回去
spring: mvc: pathmatch: matching-strategy: ant_path_matcher
之后再使用前面的几种方法就ok了,哪个生效用哪个。
或者,直接降boot的版本。
总结
如有错误或未考虑完全的地方,望不吝赐教