【问题标题】:/tmp/tomcat-docbase is always created with a Spring Boot JAR (but not a WAR)/tmp/tomcat-docbase 始终使用 Spring Boot JAR(但不是 WAR)创建
【发布时间】:2017-08-22 17:03:44
【问题描述】:

我正在从 STS 创建一个标准 Spring Boot 1.5.2 'Web' 项目。如果你运行这个应用程序,你会创建两个目录——普通的“base”目录和一个“tomcat-docbase”目录

. . .  4096 Mar 29 10:00 tomcat.2743776473678691880.8080
. . .  4096 Mar 29 10:00 tomcat-docbase.76291847886629412.8080

如果我将此项目更改为 WAR 项目,我只会得到“基础”目录

. . .   4096 Mar 29 10:06 tomcat.3131223012454570991.8080

使用覆盖默认基目录很容易

 server.tomcat.basedir=.

但是这对 tomcat-docbase 没有影响。可以以编程方式覆盖 tomcat-docbase,但看起来像 hack。

有人认为这是一个错误吗?

【问题讨论】:

    标签: java spring tomcat spring-boot


    【解决方案1】:

    解决方案: 在您的项目下创建一个文件夹名称为 public,与您的 JAR 位于同一文件夹中。

    原因: 从 springboot 代码中,没有配置 docbase 文件夹。 但是您可以在项目文件夹名称中创建一个公共根文件夹,如 publicstaticsrc/main/webapp,那么 springboot 将永远不会再次为您创建临时 tomcat-docbase 文件夹。

    private static final String[] COMMON_DOC_ROOTS = { "src/main/webapp", "public", "static" }
    ...
    public final File getValidDirectory() {
        File file = this.directory;
        file = (file != null ? file : getWarFileDocumentRoot());
        file = (file != null ? file : getExplodedWarFileDocumentRoot());
        file = (file != null ? file : getCommonDocumentRoot());
        if (file == null && this.logger.isDebugEnabled()) {
            logNoDocumentRoots();
        }
        else if (this.logger.isDebugEnabled()) {
            this.logger.debug("Document root: " + file);
        }
        return file;
    }
    ...
    private File getCommonDocumentRoot() {
        for (String commonDocRoot : COMMON_DOC_ROOTS) {
            File root = new File(commonDocRoot);
            if (root.exists() && root.isDirectory()) {
                return root.getAbsoluteFile();
            }
        }
        return null;
    }
    

    链接:DocumentRoot.java

    【讨论】:

    【解决方案2】:

    我找到了一种使用 spring 和嵌入式 tomcat 服务器以编程方式设置 docbase 文件夹的方法。您必须重写 TomcatEmbeddedServletContainerFactory 实现,如下所示:

    public @Bean EmbeddedServletContainerFactory embeddedServletContainerFactory() {
        TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory("/app", 8080) {
            @Override
            protected void configureContext(Context context, ServletContextInitializer[] initializers) {
                context.setDocBase("/path/to/your/docbase");
                super.configureContext(context, initializers);
            }
        };
        return factory;
    }
    

    【讨论】:

      【解决方案3】:

      对于 Spring Boot 2.x+

      @Component
      public class EmbeddedServletContainerConfig implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {
      
          @Override
          public void customize(TomcatServletWebServerFactory factory) {
              factory.setDocumentRoot(new File("/your/path/here"));
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2019-03-26
        • 2019-08-31
        • 2016-06-05
        • 1970-01-01
        • 1970-01-01
        • 2016-12-11
        • 2015-03-10
        • 2018-12-05
        • 2020-06-11
        相关资源
        最近更新 更多