如何在Spring Boot's embedded tomcat中扩展war?

How to expand war in Spring Boot's embedded tomcat?

我有一个带有 Web 应用程序的 war 存档。我想在我的 Spring 引导应用程序中启动该应用程序。因此,我听从了 :

的建议
@Bean
public EmbeddedServletContainerFactory servletContainerFactory() {
    return new TomcatEmbeddedServletContainerFactory() {

        @Override
        protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(Tomcat tomcat) {
            try {
                tomcat.addWebapp("blog", "/tmp/roller.war");

            } catch (ServletException ex) {
                throw new IllegalStateException("Failed to add webapp", ex);
            }
            return super.getTomcatEmbeddedServletContainer(tomcat);
        }

    };
}

效果很好,除了 war 没有被提取:

Unable to create the directory [/tmp/tomcat.9153500015669016883.8080/webapps/blog]

这是 tomcat 工作目录的布局:

$ find /tmp/tomcat.9153500015669016883.8080/
/tmp/tomcat.9153500015669016883.8080/
/tmp/tomcat.9153500015669016883.8080/work
/tmp/tomcat.9153500015669016883.8080/work/Tomcat
/tmp/tomcat.9153500015669016883.8080/work/Tomcat/localhost
/tmp/tomcat.9153500015669016883.8080/work/Tomcat/localhost/blog
/tmp/tomcat.9153500015669016883.8080/work/Tomcat/localhost/ROOT

A breakpoint in ExpandWar.expand() 表明它想在 webapps/ 中创建一个目录。这个不存在的 webapps 文件夹取自 Host.getAppBaseFile()(来自 ContextConfig.context)。

所以对我来说,它看起来有些配置很奇怪,应该扩展到 work/Tomcat/localhost/blog。我该怎么做?

这似乎与 spring 无关,而是嵌入式 tomcat 的预期行为。我发现 this related issue:

The user is expected to define a valid directory for a Host's appBase.

因此,只需在部署之前创建默认的 appBase 目录即可:

tomcat.getHost().getAppBaseFile().mkdir();
tomcat.addWebapp("blog", "/tmp/roller.war");