How to service external static HTML files in Spring Boot Embedded tomcat?

后端 未结 3 469
我在风中等你
我在风中等你 2021-01-12 03:38

I\'m new to Spring framework and Spring Boot.
I\'ve implemented a very simple RESTful Spring Boot web application.
You can see the nearly full source code in another

相关标签:
3条回答
  • 2021-01-12 04:06

    I see from another of your questions that what you actually want is to be able to change the path to static resources in your application from the default values. Leaving aside the question of why you would want to do that, there are several possible answers.

    • One is that you can provide a normal Spring MVC @Bean of type WebMvcConfigurerAdapter and use the addResourceHandlers() method to add additional paths to static resources (see WebMvcAutoConfiguration for the defaults).
    • Another approach is to use the ConfigurableEmbeddedServletContainerFactory features to set the servlet context root path.
    • The full "nuclear option" for that is to provide a @Bean definition of type EmbeddedServletContainerFactory that set up the servlet container in the way you want it. If you use one of the existing concrete implementations they extend the Abstract* class that you already found, so they even have a setter for a property called documentRoot. You can also do a lot of common manipulations using a @Bean of type EmbeddedServletContainerCustomizer.
    0 讨论(0)
  • 2021-01-12 04:07

    Take a look at this Dave Syer's answer implementation.

    You can set the document root directory which will be used by the web context to serve static files using ConfigurableEmbeddedServletContainer.setDocumentRoot(File documentRoot).

    Working example:

    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);
        }
    
    }
    

    Now you can customize your app with command line and profiles (src\main\resources\application-myprofile.yml):

    > java -jar demo-0.0.1-SNAPSHOT.jar --static-assets-folder="myfolder"
    > java -jar demo-0.0.1-SNAPSHOT.jar --spring.profiles.active=myprofile
    
    0 讨论(0)
  • 2021-01-12 04:13

    Is enough if you specify '-cp .' option in command 'java -jar blabla.jar' and in current directory is 'static' directory

    0 讨论(0)
提交回复
热议问题