从自定义静态位置提供静态HTML时,Spring Boot会抛出404

时间:2016-05-28 11:06:51

标签: spring spring-boot yaml

我是Spring Boot的新手,已经阅读了他们的文档以及几篇文章,并且很难为单个静态HTML页面提供服务。我认为这里的复杂问题是,我有两个要求,我无法理解,而且我不认为文档或这些文章符合我的要求:

  1. 我想将YAML用于外部配置(所以application.yml);和
  2. 我实际上希望我的外部配置是外部!也就是说,我不希望希望它打包在我的uberjar中,而是希望它与uberjar一起部署,作为一个解耦的工件。这允许我在已部署配置文件的任何环境中运行相同的uberjar。
  3. 首先,我在编译类路径中添加了所有常用的Starter POM(提到这一点,很明显Snake YAML 应该在我的类路径上):

    compile(
        'org.codehaus.groovy:groovy-all:2.4.6'
        ,'org.springframework.boot:spring-boot-starter-jetty'
        ,'org.springframework.boot:spring-boot-starter-actuator'
    )
    compile('org.springframework.boot:spring-boot-starter-web') {
        exclude module: 'spring-boot-starter-tomcat'
    }
    

    接下来,我将src/main/resources/webapps/test.html添加到我的源代码中:

    <html>
        <head>
            <title>Test</title>
        </head>
        <body>
            This is a simple test!
        </body>
    </html>
    

    接下来,我将application.yml添加到项目的根目录中:

    spring:
      resources:
        static-locations:
          - 'classpath:/webapps/'
    

    想法是Spring Boot在本地运行时在根目录中找到此文件,但CI服务器能够在uberjar旁边部署任意(特定于环境的)application.yml

    然后我建立我的uberjar:

    ./gradlew build
    

    现在我运行我的uberjar,传入一个命令行arg,它应该告诉Spring where 找到我的配置文件:

    java -Dspring.config.location=. -jar build/libs/myapp.jar
    

    我指定&#34; .&#34;因为Gradle用完了项目的根目录,也就是application.yml所在的目录。

    应用程序启动很好,当我转到http://localhost:8080时,我会看到我通常看到的内容(我有一个@RestController/映射到一个简单的&#34 ;你好,Spring Boot&#34; string)。 但是,当我转到http://localhost:8080/test.html时,我得到了404。

    我出错的任何想法?

3 个答案:

答案 0 :(得分:3)

Spring引导自动配置会自动将src/main/resources文件夹添加为静态资源根目录。这意味着其中的所有文件夹都会自动获取 - 您无需显式添加webapps文件夹。

我刚刚将test.html置于/main/resources/lestatic/文件夹中进行了本地尝试:http://localhost:8080/test.html无需额外配置即可正常运行,classpath:/lestatic/被指定为资源时失败配置。

如果这不起作用,您应该检查构建工具是否确实将resources文件夹作为资源根目录包含在内。完成构建后,您可以通过检查target/classes文件夹中是否存在自定义文件夹来验证。

请参阅此Spring Boot manual

答案 1 :(得分:1)

  1. 将test.html放在src / main / resources / static /test.html
  2. 享受! http://localhost:8080/test.html
  3. PS。 @RestController也将继续工作。

答案 2 :(得分:0)

tldr;

Sample Application - GitHub

gradle build
java -Dspring.profiles.active=local -jar build/libs/stackoverflow-q37498214.jar

java -Dspring.profiles.active=production -jar build/libs/stackoverflow-q37498214.jar

配置文件特定属性

Spring Boot通过$ {SPRING_PROFILES_ACTIVE}环境变量支持特定于环境的配置。

如果您设置此= 本地 ,然后提供名为 application-local.yml 的配置文件,则您的Spring Boot应用程序将利用该特定于环境的配置。

您也可以通过命令行设置:

java -Dspring.profiles.active=local -jar build/libs/app.jar

查看上面的示例应用程序并查看它的实际效果。

但为什么404?

您的自定义配置路径( -Dspring.config.location =。)似乎未被选中。因此,您的自定义静态位置( classpath:/ webapps / )无法注册,因此您的网络服务器无法提供服务。

如果上述解决方案对您不起作用,那么我会要求您发布一个完整的示例项目,以便我们深入了解一下。此外,您的构建过程的详细信息,以及您提供生产配置文件的方式/时间。