【问题标题】:Adding external static files (css, js, png ...) in spring boot在 Spring Boot 中添加外部静态文件(css、js、png ...)
【发布时间】:2015-09-07 03:07:31
【问题描述】:

背景


我有一个 spring boot 应用程序,该应用程序将 logo.png 文件添加到资源文件的 static 文件夹中,该文件最终构建到执行时使用的 jar 文件中。

此 jar 应用程序需要针对不同的客户端在多个实例中运行。所以我所做的是创建一个外部application.properties 文件来区分每个用户的设置。 http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

问题


但问题是,我需要更改应用程序每个实例的徽标。我无法将客户徽标嵌入到我的应用程序 jar 中。相反,我需要像我的 application.properties 一样将其保留在外部。

目前,我所做的是在执行的jar 的同一文件夹中检查文件logo.png,如果存在,则读取文件,获取base64 数据并将其显示在img 标记中.

但我希望以适当的方式将其作为静态内容来完成。我需要将静态内容外部化。 这样我就可以让每个客户都拥有一个运行不同静态资源内容的特定 jar 实例

例如。我需要将外部静态文件保留如下,并从我认为 html 标签的 hrefsrc 属性中的 url 访问。

总结


所需的文件夹结构

+ runtime
  - myapp-0.1.0.jar
  - application.properties
  + static
    - logo.png

应该可以访问

<img th:src="@{/logo.png}" />

【问题讨论】:

    标签: java spring spring-mvc spring-boot thymeleaf


    【解决方案1】:

    您可以使用资源处理程序来提供外部文件 - 例如

    @Component
    class WebConfigurer extends WebMvcConfigurerAdapter {
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
             registry.addResourceHandler("/ext/**").addResourceLocations("file:///yourPath/static/");
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      不推荐使用 WebMvcConfigurerAdapter。从 Spring Boot 2.x 开始,您可以改用 WebMvcConfigurer。

      @Configuration
      public class MediaPathConfig {
          // I assign filePath and pathPatterns using @Value annotation
          private String filePath = "/ext/**"; 
          private String pathPatterns = "/your/static/path/";
      
          @Bean
          public WebMvcConfigurer webMvcConfigurerAdapter() {
              return new WebMvcConfigurer() {
                  @Override
                  public void addResourceHandlers(ResourceHandlerRegistry registry) {
                      if (!registry.hasMappingForPattern(pathPatterns)) {
                          registry.addResourceHandler(pathPatterns)
                                  .addResourceLocations("file:" + filePath);
                      }
                  }
              };
          }
      }
      

      【讨论】: