8

我是 Spring 框架和 Spring Boot 的新手。
我已经实现了一个非常简单的 RESTful Spring Boot Web 应用程序。
您可以在另一个问题中看到几乎完整的源代码:Spring Boot:如何外部化 JDBC 数据源配置?

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 文件的方法,但由于即使在单个 HTML 文件修改时它也需要重建和重新部署 WAR 文件,因此该方法是不可接受的。

由于我对 Spring 的了解非常有限,因此最好给出准确而具体的答案。

4

3 回答 3

6

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

  • 一种是您可以提供一个普通的 Spring MVC@Bean类型WebMvcConfigurerAdapter并使用该addResourceHandlers()方法向静态资源添加额外的路径(参见WebMvcAutoConfiguration默认值)。
  • 另一种方法是使用ConfigurableEmbeddedServletContainerFactory特性来设置 servlet 上下文根路径。
  • 完整的“核选项”是提供@Bean类型定义,EmbeddedServletContainerFactory以您想要的方式设置 servlet 容器。如果您使用现有的具体实现之一,它们会扩展Abstract*您已经找到的类,因此它们甚至有一个名为documentRoot. 您还可以使用@Beanof type进行许多常见操作EmbeddedServletContainerCustomizer
于 2013-11-20T08:18:11.770 回答
4

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

于 2014-08-11T13:17:59.253 回答
0

看看这个Dave Syer 的答案实现。

您可以设置 Web 上下文将使用的文档根目录,以使用ConfigurableEmbeddedServletContainer.setDocumentRoot(File documentRoot).

工作示例:

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

}

现在您可以使用命令行和配置文件 ( 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
于 2017-04-11T15:39:31.843 回答