/tmp/tomcat-docbase 总是使用 Spring Boot JAR(但不是 WAR)创建的



从STS我正在创建一个标准的Spring Boot 1.5.2'Web'项目。 如果你运行这个应用程序,你会创建两个目录 - 正常的"基本"目录和一个"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,但似乎是一个黑客。

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

解决方案:在项目下创建公共文件夹名称,与 JAR 位于同一文件夹中。

原因:从 springboot 代码中,没有针对 docbase 文件夹的配置。但是你可以在项目文件夹名称中创建一个公共的根文件夹,作为公共静态src/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;
}

链接: 文档根目录.java

适用于 Spring Boot 2.x+

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

我找到了一种以编程方式使用 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;
}

最新更新