Spring最近关于在Spring Boot项目中使用静态Web内容的博客文章(https://spring.io/blog/2013/12/19/serving-static-web-content-with-spring-boot)表明可以使用多个资源目录:
-
/ META-INF /资源/
-
/ resources /
-
/ static /
-
/ public /
这要归功于WebMvcAutoConfiguration类,它自动将这些目录添加到类路径中 . 这一切似乎都很好,并且在使用 spring-boot-maven-plugin spring-boot:run 目标时似乎有效,所有静态内容都在工作(例如:/index.html) .
打包Spring Boot项目并允许 spring-boot-maven-plugin 创建增强型JAR然后尝试使用 java -jar my-spring-boot-project.jar
运行项目时,您会发现静态内容现在返回404错误 .
6 回答
我正在撞墙,试图找出如何用gradle做到这一点 . 有小费吗?
编辑:我通过将其添加到我的build.gradle中来实现它:
Spring Boot将使用
WebMvcAutoConfiguration
来配置静态内容,这个类只会在你没有自定义WebMvcConfigurationSupport
bean时生效,在我的情况下,我确实有一个 .所以我只需要自己配置,这是我的解决方案:
有两件事需要考虑(Spring Boot v1.5.2.RELEASE) -
1)检查@EnableWebMvc注释的所有Controller类,如果有则删除它
2)检查使用了注释的Controller类 - @RestController或@Controller .
不要在一个类中混合使用Rest API和MVC行为 . 对于MVC,使用@Controller和REST API使用@RestController
我在static dir中有一个assets文件夹,并允许在SpringConfig中扩展
WebSecurityConfigurerAdapter
.事实证明,虽然Spring Boot很聪明地将各种资源目录添加到类路径中,但是Maven不是,并且由你来决定处理那部分 . 默认情况下,只有
src/main/resources
将包含在您的JAR中 . 如果您在项目的根目录中创建一个名为/static
的文件夹(如博客文章所暗示的那样),那么在使用 spring-boot:run Maven目标时它将正常工作,但在创建JAR后则无法正常工作 .最简单的解决方案是在
/src/main/resources
中创建/static
文件夹,然后Maven将其包含在JAR中 . 您可以选择向Maven项目添加其他资源位置:我希望这对某些人有用,当你退后一步看看Maven是如何工作的时候会很明显,但它可能会让一些人使用Spring Boot,因为它的设计非常免配置 .
我花了几页来了解如何在Spring启动环境中提供静态内容 . 大多数建议都是将静态文件放在/ static / resources / src / main / webapp等中 . 考虑分享下面的方法 .
@EnableAutoConfiguration(exclude = {//DispatcherServletAutoConfiguration.class,})
@Value(“$ {static-content.locations:file:C:/ myprj / static /”)private String [] staticContentLocations;
3.使用WebMvcConfigurerAdapter取消WebMvcAutoConfiguration建议不使用默认资源位置但使用我们指示的内容 . 如下所示
如果C:/ myprj / static有index.html,则http://localhost:portno/index.html应该有效 . 希望有所帮助 .