默认的静态资源目录
Spring Boot 中,默认的静态资源目录如下:
| 优先级(数字越小优先级越高) | 类路径位置(在/src/main/resources/中对应的目录 |
说明 |
|---|---|---|
| 1 | classpath:/META-INF/resources/ |
常用于 WebJars,放在/META-INF/resources/下的文件会被直接映射。 |
| 2 | classpath:/resources/ |
与/src/main/resources/resources/对应,适合放置不想放在static、public的资源。 |
| 3 | classpath:/static/ |
最常用的静态资源目录,放在/src/main/resources/static/下的文件会映射到根路径(/**)。 |
| 4 | classpath:/public/ |
与static类似,放在/src/main/resources/public/下的文件同样可直接访问。 |
这些路径在 Spring Boot 3.x 中,由org.springframework.boot.autoconfigure.web.WebProperties.Resources.CLASSPATH_RESOURCE_LOCATIONS定义。
访问示例
| 文件实际路径 | 访问 URL |
|---|---|
/src/main/resources/META-INF/resources/index.html |
http://localhost:8080/index.html |
/src/main/resources/META-INF/resources/1/index.html |
http://localhost:8080/1/index.html |
/src/main/resources/resources/index.html |
http://localhost:8080/index.html |
/src/main/resources/resources/2/index.html |
http://localhost:8080/2/index.html |
/src/main/resources/static/index.html |
http://localhost:8080/index.html |
/src/main/resources/static/3/index.html |
http://localhost:8080/3/index.html |
/src/main/resources/public/index.html |
http://localhost:8080/index.html |
/src/main/resources/public/4/index.html |
http://localhost:8080/4/index.html |
相关说明
-
不需要在 URL 中填写静态资源目录(如
/META-INF/resources/、/resources/、/static/、/public/),Spring Boot 会自动把根路径映射到这些目录; -
优先级:如果同名资源出现在多个目录,按
/META-INF/resources/->/resources/->/static/->/public/的顺序决定最终返回的文件; -
自定义:如果想改动默认位置,可在
application.properties(或application.yml或application.yaml)中配置spring.web.resources.static-locations,该配置会覆盖默认值,也就是上述默认的静态资源目录将失效(由于 Spring Boot 的兜底机制,部分目录依然有效,具体说明见5),需要在该配置项显式配置,优先级也由该配置的顺序决定(越靠前优先级越高); -
欢迎页(index.html):放在上述任意目录的根路径下,会被自动识别为默认首页;
-
由于 Spring Boot 的兜底机制,即便
spring.web.resources.static-locations置空,或配置的自定义路径,没有配置上述的默认静态资源目录,其它默认配置会失效,/META-INF/resources/还是有效的,相当于会自动在该配置最后添加/META-INF/resources/,可通过配置spring.web.resources.add-mappings=false关闭兜底机制。
默认配置相关代码
org.springframework.boot.autoconfigure.web.WebProperties.Resources.CLASSPATH_RESOURCE_LOCATIONS相关源码如下:
java
@ConfigurationProperties("spring.web")
public class WebProperties {
// ...
public static class Resources {
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};
private String[] staticLocations;
private boolean addMappings;
private boolean customized;
private final Chain chain;
private final Cache cache;
public Resources() {
this.staticLocations = CLASSPATH_RESOURCE_LOCATIONS;
this.addMappings = true;
this.customized = false;
this.chain = new Chain();
this.cache = new Cache();
}
public String[] getStaticLocations() {
return this.staticLocations;
}
public void setStaticLocations(String[] staticLocations) {
this.staticLocations = this.appendSlashIfNecessary(staticLocations);
this.customized = true;
}
// ...
}
// ...
}