虽然 运行 作为 jar 应用程序,但无法在 spring boot 中访问静态文件

While running as a jar application, Not able to access static files in springboot

我有一个具有以下文件夹结构的基本 springboot 应用程序。在 webapps 里面我有一些图片和 css.

如果我 运行 使用我的 Intellij IDE,我可以访问图像和 css

localhost:8080/images/test.png

但是如果我创建一个 fat jar 并 运行 它使用 java -jar demo.jar 然后我无法访问这些图像或 css 文件夹

这就是我使用 Maven 插件构建 jar 的方式

   <build>
        <resources>
            <resource>
                <directory>src/main/webapp</directory>
                <includes>
                    <include>css/default.css</include>
                    <include>images/*</include>
                </includes>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>build-info</goal>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

如何确保这些图像和 css 文件在运行作为 jar 文件

时可用

问题是在JAR-file的情况下,src/main/webapp没有特殊意义。不建议按照the documentation使用:

Do not use the src/main/webapp directory if your application is packaged as a jar. Although this directory is a common standard, it works only with war packaging, and it is silently ignored by most build tools if you generate a jar.

完成这项工作的方法是将 src/main/webapp 视为普通的 类路径目录 。您通过添加 <resources> 标签做到了这一点。

但是,Spring 引导仅提供来自某些文件夹(/public/static/META-INF/resources)的静态内容。由于您没有将文件放在这样的文件夹中,因此 Spring boot 不会为它们提供服务。

要解决这个问题,您需要将文件放在 src/main/resources/public(推荐)或 src/main/webapp/public[=31= 中].如果移动文件不是一个选项,您还可以更改 Maven 以将其放入该目录中:

<resources>
    <resource>
        <directory>src/main/webapp</directory>
        <targetPath>public/</targetPath> <!-- Add this -->
        <includes>
            <include>css/default.css</include>
            <include>images/*</include>
        </includes>
    </resource>
</resources>