带有静态内容的Spring Boot项目在运行jar时会生成404

Rob*_*unt 26 spring jetty static-content maven spring-boot

Spring 最近关于在Spring Boot项目中使用静态Web内容的博客文章(https://spring.io/blog/2013/12/19/serving-static-web-content-with-spring-boot)表明可以使用几个资源目录:

  • / META-INF /资源/
  • /资源/
  • /静态的/
  • /上市/

这要归功于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错误.

Rob*_*unt 41

事实证明,虽然Spring Boot在将各种资源目录添加到类路径时非常聪明,但Maven却没有,并且由您来处理该部分.默认情况下,只会src/main/resources包含在您的JAR中.如果您创建一个/static在项目根目录中调用的文件夹(如博客文章所暗示的那样),那么在使用spring-boot时它将正常工作:运行 Maven目标但不是在创建JAR之后.

最简单的解决方案是在/static里面创建你的文件夹/src/main/resources,然后Maven将它包含在JAR中.您可以选择向Maven项目添加其他资源位置:

<resources>
    <resource>
        <directory>src/main/resources</directory>
    </resource>
    <resource>
        <directory>static</directory>
        <targetPath>static</targetPath>
    </resource>
</resources>
Run Code Online (Sandbox Code Playgroud)

我希望这对某些人有用,当你退后一步看看Maven是如何运作的时候会很明显,但是它可能会让一些人使用Spring Boot,因为它的设计非常免配置.

  • 这对我不起作用,在pom.xml中添加资源是不够的.相反,我必须使用`<addResources> true </ addResources>`配置Spring启动插件.请参阅此答案http://stackoverflow.com/questions/24762657/refreshing-static-content-with-spring-mvc-and-boot#answer-39334398 (3认同)

kgr*_*nek 8

我正在撞墙,试图找出如何用gradle做这件事.有小费吗?

编辑:我通过添加到我的build.gradle得到它的工作:

// Copy resources into the jar as static content, where Spring expects it.
jar.into('static') {
    from('src/main/webapp')
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,所以最简单的(最少配置,最大功能)解决方案是将您的静态资源放在"src/main/resourecs/static"中.这就是我的意思. (5认同)
  • Gradle也默认使用"src/main/resources".使用它有什么问题? (2认同)
  • 这是事实,将它直接放入资源会将你的文件复制到jar中.但是,为了让Spring能够将您的文件识别并作为静态内容提供,您需要将它打包在jar中名为"static","public","resources"或"/ META-INF/resources /"的目录下文件.如果您只是将文件放在资源目录中,那么它们都会被复制到jar中的根目录中,当您尝试访问它们时Spring会提供404. (2认同)