如何在Spring Boot的嵌入式tomcat中扩展战争?

时间:2016-06-10 07:21:40

标签: spring tomcat spring-boot war

我有一个带有Web应用程序的war存档。我想在Spring Boot应用程序中启动该应用程序。因此,我遵循了that question的建议:

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

    };
}

除非战争没有被提取,否则效果很好:

  

无法创建目录[/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

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

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

1 个答案:

答案 0 :(得分:3)

这似乎与Spring无关,而是嵌入式tomcat的预期行为。我找到了this related issue

  

用户需要为主机的appBase定义一个有效的目录。

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

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