如何在Spring Boot Embedded tomcat中维护外部静态HTML文件?

时间:2013-11-19 05:56:01

标签: spring tomcat spring-boot

我是Spring框架和Spring Boot的新手 我已经实现了一个非常简单的RESTful Spring Boot Web应用程序 您可以在另一个问题中看到几乎完整的源代码:Spring Boot: How to externalize JDBC datasource configuration?

app如何服务外部静态HTML,css js文件?
例如,目录结构可能如下:

MyApp\
   MyApp.jar (this is the Spring Boot app that services the static files below)
   static\
       index.htm
       images\
           logo.jpg
       js\
           main.js
           sub.js
       css\
           app.css
       part\
           main.htm
           sub.htm

我已经阅读了构建包含静态HTML文件的.WAR文件的方法,但由于它需要重建和重新部署WAR文件,即使在单个HTML文件修改时,该方法也是不可接受的。

一个确切而具体的答案是可取的,因为我对Spring的了解非常有限。

3 个答案:

答案 0 :(得分:6)

我从another of your questions看到你真正想要的是能够从默认值更改应用程序中静态资源的路径。撇开为什么要这样做的问题,有几个可能的答案。

  • 一个是您可以提供@Bean类型的普通Spring MVC WebMvcConfigurerAdapter,并使用addResourceHandlers()方法添加静态资源的其他路径(请参阅WebMvcAutoConfiguration默认值)。
  • 另一种方法是使用ConfigurableEmbeddedServletContainerFactory功能来设置servlet上下文根路径。
  • 完整的“核选项”是提供类型@Bean的{​​{1}}定义,以您希望的方式设置servlet容器。如果您使用现有的具体实现之一,则会扩展您已找到的EmbeddedServletContainerFactory类,因此它们甚至可以为名为Abstract*的属性设置setter。您还可以使用documentRoot类型的@Bean进行大量常见操作。

答案 1 :(得分:3)

如果你指定' -cp就足够了。'命令中的选项' java -jar blabla.jar'并且在当前目录中是静态的'目录

答案 2 :(得分:0)

看看this Dave Syer的答案实施。

您可以设置文档根目录,该目录将由Web上下文用于使用ConfigurableEmbeddedServletContainer.setDocumentRoot(File documentRoot)提供静态文件。

工作示例:

cars = Car.objects.all()
fords = cars.filter(make="Ford")[:3]

现在,您可以使用command line和个人资料({% for ford in fords %} {{ ford.price }} {% endfor %} )自定义您的应用:

package com.example.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
import org.springframework.boot.web.servlet.ServletContextInitializer;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.util.StringUtils;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import java.io.File;
import java.nio.file.Paths;

@Configuration
public class WebConfigurer implements ServletContextInitializer, EmbeddedServletContainerCustomizer {
    private final Logger log = LoggerFactory.getLogger(WebConfigurer.class);

    private final Environment env;
    private static final String STATIC_ASSETS_FOLDER_PARAM = "static-assets-folder";
    private final String staticAssetsFolderPath;

    public WebConfigurer(Environment env, @Value("${" + STATIC_ASSETS_FOLDER_PARAM + ":}") String staticAssetsFolderPath) {
        this.env = env;
        this.staticAssetsFolderPath = staticAssetsFolderPath;
    }

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        if (env.getActiveProfiles().length > 0) {
            log.info("Web application configuration, profiles: {}", (Object[]) env.getActiveProfiles());
        }
        log.info(STATIC_ASSETS_FOLDER_PARAM + ": '{}'", staticAssetsFolderPath);
    }

    private void customizeDocumentRoot(ConfigurableEmbeddedServletContainer container) {
        if (!StringUtils.isEmpty(staticAssetsFolderPath)) {
            File docRoot;
            if (staticAssetsFolderPath.startsWith(File.separator)) {
                docRoot = new File(staticAssetsFolderPath);
            } else {
                final String workPath = Paths.get(".").toUri().normalize().getPath();
                docRoot = new File(workPath + staticAssetsFolderPath);
            }
            if (docRoot.exists() && docRoot.isDirectory()) {
                log.info("Custom location is used for static assets, document root folder: {}",
                        docRoot.getAbsolutePath());
                container.setDocumentRoot(docRoot);
            } else {
                log.warn("Custom document root folder {} doesn't exist, custom location for static assets was not used.",
                        docRoot.getAbsolutePath());
            }
        }
    }

    @Override
    public void customize(ConfigurableEmbeddedServletContainer container) {
        customizeDocumentRoot(container);
    }

}