springboot 静态资源无法访问
在一个项目中WebMvcConfigurationSupport只能存在一个,多个的时候,只有一个会生效。(按名称排序后第一个的)
1.SpringBoot 的 @EnableAutoConfiguration 会启用自动配置类
2.WebMvcAutoConfiguration,该类配置了一些默认的静态资源映射
- 自动映射 localhost:8080/** 为以下路径
classpath:/resources/ classpath:/static/ classpath:/public/ classpath:/META-INF/resources/
- 自动映射 localhost:8080/webjars/** 为以下路径
classpath:/META-INF/resources/webjars/
- 自动映射 localhost:8080/webjars/** 为以下路径
此时,我们不需要多做什么,只要将静态资源放入 src/main/resources 目录下的 resources、static 或 public 文件夹下,即可通过 url 定位相关资源,例如 localhost:8080/index.html 可定位至 src/main/resources/static/index.html
但是!
一旦使用继承了WebMvcConfigurationSupport或者WebMvcConfigurerAdapter的自定义配置类,即使没有重写addResourceHandlers方法,默认配置都会被不被采用。如果要采用原本默认的配置,则需要webmvc配置类中重写如下方法:
1 |
|
经过试验得证:如果不使用WebMvcConfigurationSupport,则使用application.properties中的默认配置
如果重写了application.properties中的配置,则使用重写后的配置,如:
1 | spring.resources.static-locations=resources/, static/, public/, \ META-INF/resources/, resources/, classpath:static/, public/, classpath:META-INF/resources/, \file:///tmp/webapps/ |
一旦使用了WebMvcConfigurationSupport(或WebMvcConfigurerAdapter)那么必须要重写addResourceHandlers来配置资源映射,此时application.properties中关于静态资源访问的配置将失效(除非对url写了响应的controller来处理,那是另一回事)
当添加了静态资源后,无法立即访问的问题
如果访问项目中的静态资源,访问的所有的东西其实都是target目录中的,这是经过编译的,如果对项目目录下的静态资源进行修改(增删改),由于target下的东西没有受影响,所以没法立即生效,比如往/resouces/static下增加一张图片,通过url无法立即访问到,必须重启项目。其实重启就是让资源文件经过编译(其实资源文件根本不编译)后,加到target中,那么这样就很麻烦,要是想对一个静态资源修改后能立即通过url访问到要如何做呢?
解决办法将静态资源放在非项目类路径下即可,例如 “file:///Users/mytest/inspector/independent_resources/“);,并且在资源处理器中加上路径即可。
file:// 后面跟的必须是文件系统的绝对路径
1 | registry.addResourceHandler("/**”) |
见https://blog.csdn.net/rui18300072030/article/details/74923580
因此,需要修改后立即生效的文件,尤其是非代码文件(除去html,css这种)最好是放在项目类的外部,放在文件系统的绝对路径下。如果文件必须放在项目中,但又必须得立即生效,
那么对项目中的同一个资源目录,即添加其相对路径,又添加其绝对路径:
如果文件必须放在项目中,但又必须得立即生效,那么用下面的方法:
对项目中的同一个资源目录,即添加其相对路径,又添加其绝对路径:
1 | registry.addResourceHandler("/**") |
上面两个路径其实是同一个,但通过上面相对路径访问的是target中的东西。在运行时添加一个文件后,target没有更新,通过相对路径就访问不到,但实际上文件系统是更新了,所以用下面的绝对路径直接访问文件系统中的文件就可。